<!DOCTYPE html>
<html lang="en-US" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Jenkins | VitePress</title>
    <meta name="description" content="A VitePress site">
    <link rel="preload stylesheet" href="/notebook/assets/style.3dbfd0c2.css" as="style">
    
    <script type="module" src="/notebook/assets/app.8aaa4cbe.js"></script>
    <link rel="preload" href="/notebook/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/notebook/assets/chunks/framework.1336c4e5.js">
    <link rel="modulepreload" href="/notebook/assets/chunks/theme.20cddc0c.js">
    <link rel="modulepreload" href="/notebook/assets/5、运维_Jenkins.md.929081f8.lean.js">
    <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-255ec12d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ae3e3f51></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ae3e3f51> Skip to content </a><!--]--><!----><header class="VPNav" data-v-255ec12d data-v-7e5bc4a5><div class="VPNavBar has-sidebar" data-v-7e5bc4a5 data-v-0937f67c><div class="container" data-v-0937f67c><div class="title" data-v-0937f67c><div class="VPNavBarTitle has-sidebar" data-v-0937f67c data-v-86d1bed8><a class="title" href="/notebook/" data-v-86d1bed8><!--[--><!--]--><!--[--><img class="VPImage logo" src="/notebook/Vue.png" alt data-v-8426fc1a><!--]--><!--[-->任硕的文档<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-0937f67c><div class="curtain" data-v-0937f67c></div><div class="content-body" data-v-0937f67c><!--[--><!--]--><div class="VPNavBarSearch search" style="--vp-meta-key:&#39;Meta&#39;;" data-v-0937f67c><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0937f67c data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>Java学前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/HTML+JS.html" data-v-2f2cfafc><!--[-->HTML+JS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/CSS.html" data-v-2f2cfafc><!--[-->CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue2+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue2+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue3+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue3+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/React.html" data-v-2f2cfafc><!--[-->React<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>软件测试</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->测试基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95.html" data-v-2f2cfafc><!--[-->压力测试<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>多线程</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-2f2cfafc><!--[-->基础篇<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B9%B6%E5%8F%91%E5%AE%8C%E5%96%84.html" data-v-2f2cfafc><!--[-->进阶篇<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>开发工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/Chrome.html" data-v-2f2cfafc><!--[-->Chrome<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->IDEA基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E6%8F%92%E4%BB%B6.html" data-v-2f2cfafc><!--[-->IDEA插件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/VS%20Code.html" data-v-2f2cfafc><!--[-->VS Code<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>消息中间件</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ.html" data-v-2f2cfafc><!--[-->RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ.html" data-v-2f2cfafc><!--[-->RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka.html" data-v-2f2cfafc><!--[-->Kafka<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Canal.html" data-v-2f2cfafc><!--[-->Canal<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0937f67c data-v-f6a63727><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-f6a63727 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0937f67c data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0937f67c data-v-40855f84 data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-a7b5672a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-a7b5672a><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><!----><!--[--><!--[--><!----><div class="group" data-v-40855f84><div class="item appearance" data-v-40855f84><p class="label" data-v-40855f84>Appearance</p><div class="appearance-action" data-v-40855f84><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-40855f84 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-40855f84><div class="item social-links" data-v-40855f84><div class="VPSocialLinks social-links-list" data-v-40855f84 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0937f67c data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-255ec12d data-v-5cfd5582><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5cfd5582><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5cfd5582><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5cfd5582>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5cfd5582 data-v-18201f51><button data-v-18201f51>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-255ec12d data-v-845b8fc6><div class="curtain" data-v-845b8fc6></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-845b8fc6><span class="visually-hidden" id="sidebar-aria-label" data-v-845b8fc6> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Java</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%9B%86%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java集合</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Linux</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Shell.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Shell脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实用脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E8%BD%AF%E4%BB%B6%E9%83%A8%E7%BD%B2.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>软件部署</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Nginx</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%AE%9E%E6%88%98%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实战篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E9%9D%A2%E8%AF%95%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>面试篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SSM</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Maven.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Spring.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Spring</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringMVC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringMVC</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringBatch.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringBatch</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringBoot</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%BA%94%E7%94%A8%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>应用篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E8%BF%90%E7%BB%B4&amp;%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>运维&原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringCloud</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringCloud</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/Sentinel.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Sentinel</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringSecurity</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Mybatis & MybatisPlus</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/Mybatis.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Mybatis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/MybatisPlus.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MybatisPlus</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/JPA.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JPA</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible has-active" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Git & ChatGPT</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Git.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Github.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ChatGPT</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Jenkins.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Netty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>数据库</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MySQL</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%AE%BE%E8%AE%A1.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL运维</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分库分表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Redis</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis原理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>本地缓存</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MongoDB</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E6%95%B4%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>ElasticSearch</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/1%E3%80%81ES%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/3%E3%80%81ES%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/influxdb.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>InfluxDB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Neo4j.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Neo4j</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>高并发 & 秒杀 & 分布式</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E5%88%86%E5%B8%83%E5%BC%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式理论</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式锁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E7%A7%92%E6%9D%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>秒杀</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%8F%AF%E7%94%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高可用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%B9%B6%E5%8F%91.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高并发</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>云原生</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/K8S.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>K8S</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>可视化 & 监控</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%A4%A7%E5%B1%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>可视化大屏</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/Zabbix.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Zabbix</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>学前端</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>HTML+CSS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/HTML%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>HTML基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/CSS%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/%E7%BD%91%E9%A1%B5%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>网页进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>JS+TS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/TypeScript.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>TS基础</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>NodeJS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Vue</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E6%96%B0%E8%AF%AD%E6%B3%95.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3新语法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue2/Vue2%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小程序</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/uniapp.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>uniapp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>计算机基础</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>数据结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>操作系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>设计模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>计算机网络</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/UML.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>UML</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%AE%97%E6%B3%95/LeetCode.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>LeetCode</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>项目实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>云尚办公</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E4%BA%91%E5%B0%9A%E5%8A%9E%E5%85%AC/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小兔鲜</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%871.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>地图</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>苍穹外卖</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>黑马头条</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E6%94%AF%E4%BB%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>支付</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0" data-v-845b8fc6 data-v-9b797284><!----><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/team.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>团队成员</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-255ec12d data-v-669faec9><div class="VPDoc has-sidebar has-aside" data-v-669faec9 data-v-6b87e69f><!--[--><!--]--><div class="container" data-v-6b87e69f><div class="aside" data-v-6b87e69f><div class="aside-curtain" data-v-6b87e69f></div><div class="aside-container" data-v-6b87e69f><div class="aside-content" data-v-6b87e69f><div class="VPDocAside" data-v-6b87e69f data-v-3f215769><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" data-v-3f215769 data-v-ff0f39c8><div class="content" data-v-ff0f39c8><div class="outline-marker" data-v-ff0f39c8></div><div class="outline-title" data-v-ff0f39c8>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0f39c8><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0f39c8> Table of Contents for current page </span><ul class="root" data-v-ff0f39c8 data-v-d0ee3533><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-6b87e69f><div class="content-container" data-v-6b87e69f><!--[--><!--]--><!----><main class="main" data-v-6b87e69f><div style="position:relative;" class="vp-doc _notebook_5%E3%80%81%E8%BF%90%E7%BB%B4_Jenkins" data-v-6b87e69f><div><h1 id="jenkins" tabindex="-1">Jenkins <a class="header-anchor" href="#jenkins" aria-label="Permalink to &quot;Jenkins&quot;">​</a></h1><p>Jenkins，原名 Hudson，2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。</p><p>官方网站：<a href="https://www.jenkins.io/" target="_blank" rel="noreferrer">https://www.jenkins.io/</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100941073.png" alt="image-20220810094145988" style="zoom:50%;"><h1 id="gitlab安装使用" tabindex="-1">GitLab安装使用 <a class="header-anchor" href="#gitlab安装使用" aria-label="Permalink to &quot;GitLab安装使用&quot;">​</a></h1><p>官方网站：<a href="https://about.gitlab.com/" target="_blank" rel="noreferrer">https://about.gitlab.com/</a></p><p>安装所需最小配置：内存至少4G</p><p>最低要求网站：<a href="https://docs.gitlab.cn/jh/install/requirements.html" target="_blank" rel="noreferrer">https://docs.gitlab.cn/jh/install/requirements.html</a></p><p>安装：<a href="https://gitlab.cn/install/" target="_blank" rel="noreferrer">https://gitlab.cn/install/</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100952502.png" alt="image-20220810095225415" style="zoom:50%;"><h2 id="centos7安装" tabindex="-1">centos7安装 <a class="header-anchor" href="#centos7安装" aria-label="Permalink to &quot;centos7安装&quot;">​</a></h2><p>官方安装文档：<a href="https://gitlab.cn/install/?version=ce" target="_blank" rel="noreferrer">https://gitlab.cn/install/?version=ce</a></p><h3 id="_1-安装和配置必须的依赖项" tabindex="-1">1. 安装和配置必须的依赖项 <a class="header-anchor" href="#_1-安装和配置必须的依赖项" aria-label="Permalink to &quot;1. 安装和配置必须的依赖项&quot;">​</a></h3><p>在 CentOS 7上，下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤，如果您打算仅从本地网络访问极狐GitLab，则可以跳过它。</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">sudo yum install </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">y curl policycoreutils</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">python openssh</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">server perl</span></span>
<span class="line"><span style="color:#A6ACCD;">sudo systemctl enable sshd</span></span>
<span class="line"><span style="color:#A6ACCD;">sudo systemctl start sshd</span></span></code></pre></div><p>（可选）下一步，安装 Postfix 以发送电子邮件通知。如果您想使用其他解决方案发送电子邮件，请跳过此步骤并在安装极狐GitLab 后<a href="https://docs.gitlab.cn/omnibus/settings/smtp.html" target="_blank" rel="noreferrer">配置外部 SMTP 服务器</a>。</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">sudo yum install postfix</span></span>
<span class="line"><span style="color:#A6ACCD;">sudo systemctl enable postfix</span></span>
<span class="line"><span style="color:#A6ACCD;">sudo systemctl start postfix</span></span></code></pre></div><p>在安装 Postfix 的过程中可能会出现一个配置界面，在该界面中选择“Internet Site”并按下回车。把“mail name”设置为您服务器的外部 DNS 域名并按下回车。如果还有其它配置界面出现，继续按下回车以接受默认配置。</p><h3 id="_2-下载-安装极狐gitlab" tabindex="-1">2. 下载/安装极狐GitLab <a class="header-anchor" href="#_2-下载-安装极狐gitlab" aria-label="Permalink to &quot;2. 下载/安装极狐GitLab&quot;">​</a></h3><p>配置极狐GitLab 软件源镜像。</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">curl </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">fsSL https:</span><span style="color:#89DDFF;">//</span><span style="color:#A6ACCD;">packages</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">cn</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">repository</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">raw</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">scripts</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">setup</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">sh </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">bin</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">bash</span></span></code></pre></div><p>接下来，安装极狐GitLab。确保您已正确<a href="https://docs.gitlab.cn/omnibus/settings/dns.html" target="_blank" rel="noreferrer">设置您的 DNS</a>，并更改 <a href="https://gitlab.example.com" target="_blank" rel="noreferrer">https://gitlab.example.com</a> 为您要访问极狐GitLab 实例的 URL。安装包将在该 URL 上自动配置和启动极狐GitLab。</p><p>对于 <code>https</code> 站点，极狐GitLab 将使用 Let&#39;s Encrypt 自动请求 SSL 证书，这需要有效的主机名和入站 HTTP 访问。您也可以使用自己的证书或仅使用 <code>http://</code>（不带<code>s</code>）。</p><p>如果您想为初始管理员用户(<code>root</code>)指定自定义密码，请查看<a href="https://docs.gitlab.cn/omnibus/installation/index.html#%E8%AE%BE%E7%BD%AE%E5%88%9D%E5%A7%8B%E5%AF%86%E7%A0%81" target="_blank" rel="noreferrer">文档</a>。如果未指定密码，将自动生成随机密码。</p><p>执行如下命令开始安装：</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">sudo EXTERNAL_URL</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">https://192.168.22.130</span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> yum install </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">y gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">jh</span></span></code></pre></div><p>启动gitlab</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl start                  </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 启动所有 gitlab 组件</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101005637.png" alt="image-20220810100502559" style="zoom:67%;"><h3 id="_3-访问极狐gitlab-实例并登录" tabindex="-1">3. 访问极狐GitLab 实例并登录 <a class="header-anchor" href="#_3-访问极狐gitlab-实例并登录" aria-label="Permalink to &quot;3. 访问极狐GitLab 实例并登录&quot;">​</a></h3><p>注意：是https <a href="https://192.168.22.130/" target="_blank" rel="noreferrer">https://192.168.22.130/</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101051986.png" alt="image-20220810105132871" style="zoom:67%;"><p>除非您在安装过程中指定了自定义密码，否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中(出于安全原因，24 小时后，此文件会被第一次 <code>gitlab-ctl reconfigure</code> 自动删除，因此若使用随机密码登录，建议安装成功初始登录成功之后，立即修改初始密码）。使用此密码和用户名 <code>root</code> 登录。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101054043.png" alt="image-20220810105407982" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101054461.png" alt="image-20220810105431390" style="zoom:67%;"><p>有关安装和配置的详细说明，请参阅我们的<a href="https://docs.gitlab.cn/omnibus/installation/" target="_blank" rel="noreferrer">文档</a>。</p><p>修改登录密码</p><p><a href="https://192.168.22.130/admin/users/root/edit" target="_blank" rel="noreferrer">https://192.168.22.130/admin/users/root/edit</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101057315.png" alt="image-20220810105737244" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101056125.png" alt="image-20220810105652069" style="zoom:67%;"><h3 id="_4-后续配置" tabindex="-1">4. 后续配置 <a class="header-anchor" href="#_4-后续配置" aria-label="Permalink to &quot;4. 后续配置&quot;">​</a></h3><p>完成安装后，请参考建议的<a href="https://docs.gitlab.cn/jh/install/next_steps.html" target="_blank" rel="noreferrer">后续配置</a>，包括身份验证选项和注册限制的配置。</p><h3 id="_5-查看剩余内存" tabindex="-1">5 查看剩余内存 <a class="header-anchor" href="#_5-查看剩余内存" aria-label="Permalink to &quot;5 查看剩余内存&quot;">​</a></h3><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">free </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">m</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101014880.png" alt="image-20220810101451815" style="zoom:67%;"><h2 id="gitlab常用命令" tabindex="-1">gitlab常用命令 <a class="header-anchor" href="#gitlab常用命令" aria-label="Permalink to &quot;gitlab常用命令&quot;">​</a></h2><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl start                  </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 启动所有 gitlab 组件</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101005637.png" alt="image-20220810100502559" style="zoom:67%;"><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl stop                   </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 停止所有 gitlab 组件；</span></span>
<span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl restart                </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 重启所有 gitlab 组件；</span></span>
<span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl status                 </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 查看服务状态；</span></span>
<span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl reconfigure            </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 启动服务；</span></span>
<span class="line"><span style="color:#A6ACCD;">vi </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">etc</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">rb         </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 修改默认的配置文件；</span></span>
<span class="line"><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">ctl tail                   </span><span style="color:#89DDFF;">#</span><span style="color:#A6ACCD;"> 查看日志；</span></span></code></pre></div><h2 id="docker下安装" tabindex="-1">docker下安装 <a class="header-anchor" href="#docker下安装" aria-label="Permalink to &quot;docker下安装&quot;">​</a></h2><p><a href="https://docs.gitlab.cn/jh/install/docker.html" target="_blank" rel="noreferrer">https://docs.gitlab.cn/jh/install/docker.html</a></p><p>安装所需最小配置</p><ul><li>内存至少4G</li><li>系统内核至少在3.10以上 <code>uname -r</code> 命令可查看系统内核版本</li></ul><p>1.添加容器</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">run</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--detach</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--hostname</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">192.168</span><span style="color:#C3E88D;">.22.130</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--publish</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">443</span><span style="color:#C3E88D;">:443</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--publish</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">80</span><span style="color:#C3E88D;">:80</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--name</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">gitlab</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--restart</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">always</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--volume</span><span style="color:#A6ACCD;"> $GITLAB_HOME</span><span style="color:#C3E88D;">/config:/etc/gitlab:Z</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--volume</span><span style="color:#A6ACCD;"> $GITLAB_HOME</span><span style="color:#C3E88D;">/logs:/var/log/gitlab:Z</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--volume</span><span style="color:#A6ACCD;"> $GITLAB_HOME</span><span style="color:#C3E88D;">/data:/var/opt/gitlab:Z</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">--shm-size</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">256</span><span style="color:#C3E88D;">m</span><span style="color:#A6ACCD;"> \</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C3E88D;">registry.gitlab.cn/omnibus/gitlab-jh:latest</span></span></code></pre></div><p>2.启动容器</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">start</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">gitlab</span></span></code></pre></div><p>3.查看已存在的容器</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">ps</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-a</span></span></code></pre></div><p>4.进入容器</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker exec -it  gitlab /bin/bash</span></span></code></pre></div><h3 id="登录访问" tabindex="-1">登录访问 <a class="header-anchor" href="#登录访问" aria-label="Permalink to &quot;登录访问&quot;">​</a></h3><h4 id="http-192-168-22-130" tabindex="-1"><a href="http://192.168.22.130" target="_blank" rel="noreferrer">http://192.168.22.130</a> <a class="header-anchor" href="#http-192-168-22-130" aria-label="Permalink to &quot;http://192.168.22.130&quot;">​</a></h4><p>当首次运行出现502错误的时候排查两个原因</p><ol><li>虚拟机内存至少需要4g</li><li>稍微再等等刷新一下可能就好了</li></ol><h3 id="管理员账号登录" tabindex="-1">管理员账号登录 <a class="header-anchor" href="#管理员账号登录" aria-label="Permalink to &quot;管理员账号登录&quot;">​</a></h3><p>用户名：root</p><p>密码存在下面文件中，登录后需要改密码不然24小时之后会失效</p><div class="language-apl"><button title="Copy Code" class="copy"></button><span class="lang">apl</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">cat </span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">etc</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">gitlab</span><span style="color:#89DDFF;">/</span><span style="color:#A6ACCD;">initial_root_password</span></span></code></pre></div><h2 id="创建项目" tabindex="-1">创建项目 <a class="header-anchor" href="#创建项目" aria-label="Permalink to &quot;创建项目&quot;">​</a></h2><h3 id="gitlab创建项目" tabindex="-1">gitlab创建项目 <a class="header-anchor" href="#gitlab创建项目" aria-label="Permalink to &quot;gitlab创建项目&quot;">​</a></h3><p><a href="https://192.168.22.130/projects/new" target="_blank" rel="noreferrer">https://192.168.22.130/projects/new</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101101459.png" alt="image-20220810110136358" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101103995.png" alt="image-20220810110312900" style="zoom:67%;"><p>界面同github</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208101104583.png" alt="image-20220810110427476" style="zoom:67%;"><h1 id="jenkins安装" tabindex="-1">Jenkins安装 <a class="header-anchor" href="#jenkins安装" aria-label="Permalink to &quot;Jenkins安装&quot;">​</a></h1><p>官方文档介绍非常详细</p><p><a href="https://www.jenkins.io" target="_blank" rel="noreferrer">https://www.jenkins.io</a></p><p>安装需求</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">机器要求：</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">256 MB 内存，建议大于 512 MB</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">10 GB 的硬盘空间（用于 Jenkins 和 Docker 镜像）</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">需要安装以下软件：</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">Java 8 ( JRE 或者 JDK 都可以)</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">Docker （导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载）</span></span></code></pre></div><h3 id="安装jdk" tabindex="-1">安装JDK <a class="header-anchor" href="#安装jdk" aria-label="Permalink to &quot;安装JDK&quot;">​</a></h3><p>1 检索可用包</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum search java|grep jdk</span></span></code></pre></div><p>2 安装</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum install java-1.8.0-openjdk</span></span></code></pre></div><p>首次启动war包会在<code>/root/.jenkins</code>生成配置文件</p><p>待完全启动成功后 访问服务器8080端口完成配置</p><p>初始化后的密码：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">Jenkins initial setup is required. An admin user has been created and a password generated.</span></span>
<span class="line"><span style="color:#A6ACCD;">Please use the following password to proceed to installation:</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">4e67bbe261da476abdc63c5b51311646</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">This may also be found at: /root/.jenkins/secrets/initialAdminPassword</span></span></code></pre></div><p>密码文件使用后会自动删除</p><h3 id="maven安装" tabindex="-1">Maven安装 <a class="header-anchor" href="#maven安装" aria-label="Permalink to &quot;Maven安装&quot;">​</a></h3><p>官网</p><p><a href="https://maven.apache.org/" target="_blank" rel="noreferrer">https://maven.apache.org/</a></p><p>下载后复制到Jenkins所在服务器解压缩即可</p><h2 id="jenkins-git-maven-自动化部署配置" tabindex="-1">Jenkins + Git + Maven 自动化部署配置 <a class="header-anchor" href="#jenkins-git-maven-自动化部署配置" aria-label="Permalink to &quot;Jenkins + Git + Maven 自动化部署配置&quot;">​</a></h2><h4 id="_1-git配置" tabindex="-1">1 Git配置 <a class="header-anchor" href="#_1-git配置" aria-label="Permalink to &quot;1 Git配置&quot;">​</a></h4><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926220.png" alt="image-20220726213303821"></p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926234.png" alt="image-20220726213505879"></p><h4 id="_2-maven配置" tabindex="-1">2 Maven配置 <a class="header-anchor" href="#_2-maven配置" aria-label="Permalink to &quot;2 Maven配置&quot;">​</a></h4><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926236.png" alt="image-20220726214239888"></p><h4 id="_3-pom-xml配置" tabindex="-1">3 Pom.xml配置 <a class="header-anchor" href="#_3-pom-xml配置" aria-label="Permalink to &quot;3 Pom.xml配置&quot;">​</a></h4><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926235.png" alt="image-20220726214200732"></p><h3 id="git安装" tabindex="-1">git安装 <a class="header-anchor" href="#git安装" aria-label="Permalink to &quot;git安装&quot;">​</a></h3><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum install -y git</span></span></code></pre></div><h4 id="javahome配置-可选" tabindex="-1">javahome配置(可选) <a class="header-anchor" href="#javahome配置-可选" aria-label="Permalink to &quot;javahome配置(可选)&quot;">​</a></h4><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64</span></span>
<span class="line"><span style="color:#A6ACCD;">export JRE_HOME=$JAVA_HOME/jre</span></span>
<span class="line"><span style="color:#A6ACCD;">PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin</span></span>
<span class="line"><span style="color:#A6ACCD;">export JAVA_HOME JRE_HOME CLASS_PATH PATH</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">jdk</span></span>
<span class="line"><span style="color:#A6ACCD;">/etc/alternatives/jre_openjdk</span></span>
<span class="line"><span style="color:#A6ACCD;">source /etc/profile 立即生效</span></span></code></pre></div><h4 id="报错找不到jdk" tabindex="-1">报错找不到jdk？ <a class="header-anchor" href="#报错找不到jdk" aria-label="Permalink to &quot;报错找不到jdk？&quot;">​</a></h4><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">默认yum安装java的时候会显示安装的是openjdk1.8 实则实际上只安装了jre</span></span>
<span class="line"><span style="color:#A6ACCD;">yum install -y java-devel</span></span></code></pre></div><h4 id="maven阿里云镜像" tabindex="-1">Maven阿里云镜像 <a class="header-anchor" href="#maven阿里云镜像" aria-label="Permalink to &quot;Maven阿里云镜像&quot;">​</a></h4><p>修改<code>/usr/local/maven/conf/settings.xml</code></p><div class="language-xml"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki material-theme-palenight has-diff"><code><span class="line"><span style="color:#89DDFF;">&lt;?</span><span style="color:#F07178;">xml</span><span style="color:#C792EA;"> version</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">1.0</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C792EA;"> encoding</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">UTF-8</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">?&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">&lt;!--</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">Licensed to the Apache Software Foundation (ASF) under one</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">or more contributor license agreements.  See the NOTICE file</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">distributed with this work for additional information</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">regarding copyright ownership.  The ASF licenses this file</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">to you under the Apache License, Version 2.0 (the</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">&quot;License&quot;); you may not use this file except in compliance</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">with the License.  You may obtain a copy of the License at</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    http://www.apache.org/licenses/LICENSE-2.0</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">Unless required by applicable law or agreed to in writing,</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">software distributed under the License is distributed on an</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">&quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">KIND, either express or implied.  See the License for the</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">specific language governing permissions and limitations</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">under the License.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">--&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">&lt;!--</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> | This is the configuration file for Maven. It can be specified at two levels:</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |  1. User Level. This settings.xml file provides configuration for a single user,</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 and is normally provided in ${user.home}/.m2/settings.xml.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 NOTE: This location can be overridden with the CLI option:</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 -s /path/to/user/settings.xml</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |  2. Global Level. This settings.xml file provides configuration for all Maven</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 users on a machine (assuming they&#39;re all using the same Maven</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 installation). It&#39;s normally provided in</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 ${maven.conf}/settings.xml.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 NOTE: This location can be overridden with the CLI option:</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |                 -gs /path/to/global/settings.xml</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> | The sections in this sample file are intended to give you a running start at</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> | getting the most out of your Maven installation. Where appropriate, the default</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> | values (values used when the setting is not specified) are provided.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> |--&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">settings</span><span style="color:#89DDFF;"> </span><span style="color:#C792EA;">xmlns</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://maven.apache.org/SETTINGS/1.0.0</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"><span style="color:#89DDFF;">          </span><span style="color:#C792EA;">xmlns</span><span style="color:#89DDFF;">:</span><span style="color:#C792EA;">xsi</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"><span style="color:#89DDFF;">          </span><span style="color:#C792EA;">xsi</span><span style="color:#89DDFF;">:</span><span style="color:#C792EA;">schemaLocation</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- localRepository</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | The path to the local repository maven will use to store artifacts.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Default: ${user.home}/.m2/repository</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  &lt;localRepository&gt;/path/to/local/repo&lt;/localRepository&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">localRepository</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">${user.home}/.m2/repository</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">localRepository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- interactiveMode</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This will determine whether maven prompts you when it needs input. If set to false,</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | maven will use a sensible default value, perhaps based on some other setting, for</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | the parameter in question.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Default: true</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  &lt;interactiveMode&gt;true&lt;/interactiveMode&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  --&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- offline</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Determines whether maven should attempt to connect to the network when executing a build.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This will have an effect on artifact downloads, artifact deployment, and others.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Default: false</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  &lt;offline&gt;false&lt;/offline&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  --&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- pluginGroups</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | when invoking a command line like &quot;mvn prefix:goal&quot;. Maven will automatically add the group identifiers</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | &quot;org.apache.maven.plugins&quot; and &quot;org.codehaus.mojo&quot; if these are not already contained in the list.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginGroups</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#676E95;font-style:italic;">&lt;!-- pluginGroup</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | Specifies a further group identifier to use for plugin lookup.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;pluginGroup&gt;com.your.plugins&lt;/pluginGroup&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginGroup</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">org.mortbay.jetty</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginGroup</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginGroups</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- proxies</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This is a list of proxies which can be used on this machine to connect to the network.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Unless otherwise specified (by system property or command-line switch), the first proxy</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | specification in this list marked as active will be used.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">proxies</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#676E95;font-style:italic;">&lt;!-- proxy</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | Specification for one proxy, to be used in connecting to the network.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;proxy&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;id&gt;optional&lt;/id&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;active&gt;true&lt;/active&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;protocol&gt;http&lt;/protocol&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;username&gt;proxyuser&lt;/username&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;password&gt;proxypass&lt;/password&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;host&gt;proxy.host.net&lt;/host&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;port&gt;80&lt;/port&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;nonProxyHosts&gt;local.net|some.host.com&lt;/nonProxyHosts&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;/proxy&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">proxies</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- servers</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This is a list of authentication profiles, keyed by the server-id used within the system.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Authentication profiles can be used whenever maven must make a connection to a remote server.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">servers</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#676E95;font-style:italic;">&lt;!-- server</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | Specifies the authentication information to use when connecting to a particular server, identified by</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | a unique name within the system (referred to by the &#39;id&#39; attribute below).</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | </span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are </span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     |       used together.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;server&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;id&gt;deploymentRepo&lt;/id&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;username&gt;repouser&lt;/username&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;password&gt;repopwd&lt;/password&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;/server&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#676E95;font-style:italic;">&lt;!-- Another sample, using keys to authenticate.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;server&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;id&gt;siteServer&lt;/id&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;privateKey&gt;/path/to/private/key&lt;/privateKey&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;passphrase&gt;optional; leave empty if not used.&lt;/passphrase&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;/server&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">server</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">releases</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">username</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">ali</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">username</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">password</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">ali</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">password</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">server</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">server</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">Snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">username</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">ali</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">username</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">password</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">ali</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">password</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">server</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">servers</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- mirrors</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This is a list of mirrors to be used in downloading artifacts from remote repositories.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | It works like this: a POM may declare a repository to use in resolving certain artifacts.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | However, this repository may have problems with heavy traffic at times, so people have mirrored</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | it to several places.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | That repository definition will have a unique id, so we can create a mirror reference for that</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | repository, to be used as an alternate download site. The mirror site will be the preferred</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | server for that repository.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirrors</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#676E95;font-style:italic;">&lt;!-- mirror</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | Specifies a repository mirror site to use instead of a given repository. The repository that</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;mirror&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;id&gt;mirrorId&lt;/id&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;mirrorOf&gt;repositoryId&lt;/mirrorOf&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;name&gt;Human Readable Name for this Mirror.&lt;/name&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">      &lt;url&gt;http://my.repository.com/repo/path&lt;/url&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;/mirror&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">     --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#676E95;font-style:italic;">&lt;!--This sends everything else to /public --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">nexus</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">*</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://maven.aliyun.com/nexus/content/groups/public/</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#676E95;font-style:italic;">&lt;!--This is used to direct the public snapshots repo in the </span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">          profile below over to a different nexus group --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">nexus-public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://maven.aliyun.com/nexus/content/repositories/snapshots/</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#676E95;font-style:italic;">&lt;!--This is used to direct the public snapshots repo in the </span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">          profile below over to a different nexus group --&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">nexus-public-snapshots1</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots1</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirrorOf</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">https://artifacts.alfresco.com/nexus/content/repositories/public/</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirror</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">mirrors</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- profiles</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | This is a list of profiles which can be activated in a variety of ways, and which can modify</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | the build process. Profiles provided in the settings.xml are intended to provide local machine-</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | specific paths and repository locations which allow the build to work in the local environment.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | For example, if you have an integration testing plugin - like cactus - that needs to know where</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | your Tomcat instance is installed, you can provide a variable here such that the variable is</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | dereferenced during the build process to configure the cactus plugin.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | section of this document (settings.xml) - will be discussed later. Another way essentially</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | relies on the detection of a system property, either matching a particular value for the property,</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | value of &#39;1.4&#39; might activate a profile when the build is executed on a JDK version of &#39;1.4.2_07&#39;.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | Finally, the list of active profiles can be specified directly from the command line.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |       repositories, plugin repositories, and free-form properties to be used as configuration</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |       variables for plugins in the POM.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">profiles</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">profile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">development</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">repositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">repository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">central</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://central</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">repository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">repositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">     </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginRepositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginRepository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">central</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://central</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginRepository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginRepositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">profile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">profile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#676E95;font-style:italic;">&lt;!--this profile will allow snapshots to be searched when activated--&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">repositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">repository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">false</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">repository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">repositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">     </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginRepositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">pluginRepository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">id</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">http://public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">url</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">false</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">releases</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">true</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">enabled</span><span style="color:#89DDFF;">&gt;&lt;</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">always</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">updatePolicy</span><span style="color:#89DDFF;">&gt;&lt;/</span><span style="color:#F07178;">snapshots</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginRepository</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">      </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">pluginRepositories</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">profile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">profiles</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#A6ACCD;">   </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">activeProfiles</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">activeProfile</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">development</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">activeProfile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">activeProfile</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">public-snapshots</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">activeProfile</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">   </span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">activeProfiles</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#676E95;font-style:italic;">&lt;!-- activeProfiles</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   | List of profiles that are active for all builds.</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">   |</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  &lt;activeProfiles&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;activeProfile&gt;alwaysActiveProfile&lt;/activeProfile&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">    &lt;activeProfile&gt;anotherAlwaysActiveProfile&lt;/activeProfile&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  &lt;/activeProfiles&gt;</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">  --&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">settings</span><span style="color:#89DDFF;">&gt;</span></span></code></pre></div><h3 id="publish-over-ssh-配置" tabindex="-1">publish over ssh 配置 <a class="header-anchor" href="#publish-over-ssh-配置" aria-label="Permalink to &quot;publish over ssh 配置&quot;">​</a></h3><p>1 安装插件</p><p>在Configure System菜单里 往下来</p><p>2 添加一台目标服务器</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926235.png" alt="image-20220726223917263"></p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926239.png" alt="image-20220726223937722"></p><p>3 修改配置</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926058.png" alt="image-20220727165700419"></p><h4 id="超时机制" tabindex="-1">超时机制 <a class="header-anchor" href="#超时机制" aria-label="Permalink to &quot;超时机制&quot;">​</a></h4><p>输出命令时一定要注意不要让窗口卡主，不然Jenkins会认为认为一直没完成</p><h4 id="shell的日志输出" tabindex="-1">shell的日志输出 <a class="header-anchor" href="#shell的日志输出" aria-label="Permalink to &quot;shell的日志输出&quot;">​</a></h4><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">nohup java -jar /root/xxoo/demo*.jar &gt;mylog.log 2&gt;&amp;1 &amp;</span></span></code></pre></div><h4 id="数据流重定向" tabindex="-1">数据流重定向 <a class="header-anchor" href="#数据流重定向" aria-label="Permalink to &quot;数据流重定向&quot;">​</a></h4><p>数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据传输到其他地方</p><p>标准输入（stdin）：代码为0，使用&lt;或&lt;&lt;; 标准输出（stdout）：代码为1，使用&gt;或&gt;&gt;; 标准错误输出（stderr）：代码为2，使用2&gt;或2&gt;&gt;</p><p>&gt; 覆盖写 &gt;&gt; 追加写</p><h3 id="运行前清理" tabindex="-1">运行前清理 <a class="header-anchor" href="#运行前清理" aria-label="Permalink to &quot;运行前清理&quot;">​</a></h3><p>配置杀死之前运行的进程</p><div class="language-shell"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">#!/bin/bash</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">#删除历史数据</span></span>
<span class="line"><span style="color:#FFCB6B;">rm</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-rf</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">xxoo</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">appname</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;font-style:italic;">$1</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">#获取传入的参数</span></span>
<span class="line"><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">arg:</span><span style="color:#A6ACCD;font-style:italic;">$1</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">#获取正在运行的jar包pid</span></span>
<span class="line"><span style="color:#A6ACCD;">pid</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">`</span><span style="color:#FFCB6B;">ps</span><span style="color:#C3E88D;"> -ef </span><span style="color:#89DDFF;">|</span><span style="color:#C3E88D;"> </span><span style="color:#FFCB6B;">grep</span><span style="color:#C3E88D;"> </span><span style="color:#A6ACCD;font-style:italic;">$1</span><span style="color:#C3E88D;"> </span><span style="color:#89DDFF;">|</span><span style="color:#C3E88D;"> </span><span style="color:#FFCB6B;">grep</span><span style="color:#C3E88D;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">java -jar</span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;"> </span><span style="color:#89DDFF;">|</span><span style="color:#C3E88D;"> </span><span style="color:#FFCB6B;">awk</span><span style="color:#C3E88D;"> </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">{printf $2}</span><span style="color:#89DDFF;">&#39;`</span></span>
<span class="line"></span>
<span class="line"><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> $pid</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">#如果pid为空，提示一下，否则，执行kill命令</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-z</span><span style="color:#A6ACCD;"> $pid </span><span style="color:#89DDFF;">];</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">#使用-z 做空值判断</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">then</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;">$appname</span><span style="color:#C3E88D;"> not started</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">else</span></span>
<span class="line"><span style="color:#A6ACCD;">               </span><span style="color:#82AAFF;">kill</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-9</span><span style="color:#A6ACCD;"> $pid</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;">$appname</span><span style="color:#C3E88D;"> stoping....</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">check</span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;">`</span><span style="color:#FFCB6B;">ps</span><span style="color:#C3E88D;"> -ef </span><span style="color:#89DDFF;">|</span><span style="color:#C3E88D;"> </span><span style="color:#FFCB6B;">grep</span><span style="color:#C3E88D;"> -w </span><span style="color:#A6ACCD;">$pid</span><span style="color:#C3E88D;"> </span><span style="color:#89DDFF;">|</span><span style="color:#C3E88D;"> </span><span style="color:#FFCB6B;">grep</span><span style="color:#C3E88D;"> java</span><span style="color:#89DDFF;">`</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-z</span><span style="color:#A6ACCD;"> $check </span><span style="color:#89DDFF;">];</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">then</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;">$appname</span><span style="color:#C3E88D;"> pid:</span><span style="color:#A6ACCD;">$pid</span><span style="color:#C3E88D;"> is stop</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">else</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#82AAFF;">echo</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;">$appname</span><span style="color:#C3E88D;"> stop failed</span><span style="color:#89DDFF;">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">fi</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">fi</span></span></code></pre></div><h3 id="几种构建方式" tabindex="-1">几种构建方式 <a class="header-anchor" href="#几种构建方式" aria-label="Permalink to &quot;几种构建方式&quot;">​</a></h3><ul><li>快照依赖构建/Build whenever a SNAPSHOT dependency is built <ul><li>当依赖的快照被构建时执行本job</li></ul></li><li>触发远程构建 (例如,使用脚本) <ul><li>远程调用本job的restapi时执行本job</li></ul></li><li>job依赖构建/Build after other projects are built <ul><li>当依赖的job被构建时执行本job</li></ul></li><li>定时构建/Build periodically <ul><li>使用cron表达式定时构建本job</li></ul></li><li>向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling <ul><li>Github-WebHook出发时构建本job</li></ul></li><li>定期检查代码变更/Poll SCM <ul><li>使用cron表达式定时检查代码变更，变更后构建本job</li></ul></li></ul><h4 id="触发远程构建-gitlab上改动自动构建" tabindex="-1">触发远程构建/gitlab上改动自动构建 <a class="header-anchor" href="#触发远程构建-gitlab上改动自动构建" aria-label="Permalink to &quot;触发远程构建/gitlab上改动自动构建&quot;">​</a></h4><p>代码改动自动可以使用gitlab的webhook回调钩子调起Jenkins的启动任务接口</p><p>在构建触发器中配置接口和token</p><p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208100926069.png" alt="image-20220728170250273"></p><h4 id="定时构建" tabindex="-1">定时构建 <a class="header-anchor" href="#定时构建" aria-label="Permalink to &quot;定时构建&quot;">​</a></h4><h5 id="jenkins-cron表达式" tabindex="-1">Jenkins cron表达式 <a class="header-anchor" href="#jenkins-cron表达式" aria-label="Permalink to &quot;Jenkins cron表达式&quot;">​</a></h5><p>标准cron</p><p><a href="https://crontab.guru" target="_blank" rel="noreferrer">https://crontab.guru</a></p><p>Jenkins cron不是标准的cron表达式</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">第一个 * 表示每个小时的第几分钟，取值0~59</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">H * * * *</span></span>
<span class="line"><span style="color:#A6ACCD;">H：每小时执行一次</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">第二颗 * 表示小时，取值0~23</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">* 15 * * * 表示每天下午3点</span></span>
<span class="line"><span style="color:#A6ACCD;">* 1 * * *  表示每天凌晨1点</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">第三颗 * 表示一个月的第几天，取值1~31</span></span>
<span class="line"><span style="color:#A6ACCD;">* 1 5 * *  表示每月5日凌晨1点</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">第四颗 * 表示第几月，取值1~12</span></span>
<span class="line"><span style="color:#A6ACCD;">* 15 5 1 *  表示每年几月执行</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">第五颗 * 表示一周中的第几天，取值0~7，其中0和7代表的都是周日</span></span></code></pre></div><p><strong>“/”</strong></p><p>表示每隔多长时间，比如 */10 * * * * 表示 每隔10分钟</p><p><strong>“H”</strong></p><p>hash散列值，以job名取值，获取到以job名为入参的唯一值，相同名称值也相同，这个偏移量会和实际时间相加，获得一个真实的运行时间</p><p>意义在于：不同的项目在不同的时间运行，即使配置的值是一样的，比如 都是<code>15 * * * * </code> ，表示每个小时的第15分钟开始执行任务，那么会造成同一时间内在Jenkins中启动很多job，换成<code>H/15 * * * *</code>,那么在首次启动任务时，会有随机值参与进来，有的会在17分钟启动 有的会在19分钟启动，随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。</p><p>H的值也可以设置范围</p><p><code>H * * * *</code>表示一小时内的任意时间</p><p><code>*/10 * * * *</code>每10分钟</p><p><code>H/10 * * * *</code>每10分钟,可能是7,17,27，起始时间hash，步长不变</p><p><code>45 3 * * 1-6 </code> 每个周一至周六，凌晨3点45 执行1次</p><p><code>45 3-5 * * 1-6 </code> 每个周一至周六，凌晨3点45 ，凌晨4点45，凌晨5点45 各执行1次</p><p><code>H(40-48) 3-5 * * 1-6 </code> 在40~48之间取值 其他同上</p><p><code>45 3-5/2 * * 1-6 </code> 每个周一至周六，凌晨3点45 ，凌晨5点45 各执行1次</p><p><code>45 0-6/2 * * 1-6 * * 1-6</code> 0点开始，每间隔2小时执行一次 0:45、2:45、4:45</p><h4 id="源码变更构建" tabindex="-1">源码变更构建 <a class="header-anchor" href="#源码变更构建" aria-label="Permalink to &quot;源码变更构建&quot;">​</a></h4><p>使用Poll SCM 方式与Build periodically一样</p><p>会主动定期检查代码托管服务器上是否有变化，一旦发生变化执行job构建</p><h3 id="测试报告邮件通知" tabindex="-1">测试报告邮件通知 <a class="header-anchor" href="#测试报告邮件通知" aria-label="Permalink to &quot;测试报告邮件通知&quot;">​</a></h3><p>使用163免费邮箱发送邮件时注意密码填认证码，也就是发送手机短信后给的那个，不要用登录邮箱的密码</p><p>类似下面。。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">KDWJUWDQBWMOYGDC</span></span></code></pre></div><h3 id="" tabindex="-1"><a class="header-anchor" href="#" aria-label="Permalink to &quot;&quot;">​</a></h3><h3 id="自动化部署到docker容器中" tabindex="-1">自动化部署到docker容器中 <a class="header-anchor" href="#自动化部署到docker容器中" aria-label="Permalink to &quot;自动化部署到docker容器中&quot;">​</a></h3><h4 id="docker外挂目录" tabindex="-1">docker外挂目录 <a class="header-anchor" href="#docker外挂目录" aria-label="Permalink to &quot;docker外挂目录&quot;">​</a></h4><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker run -d -p 8080:8080 --name demo-out -v /root/jarfile/demo-1-0.0.1-SNAPSHOT.jar:/app.jar openjdk:11 java -jar app.jar</span></span></code></pre></div><h4 id="打包到容器内" tabindex="-1">打包到容器内 <a class="header-anchor" href="#打包到容器内" aria-label="Permalink to &quot;打包到容器内&quot;">​</a></h4><ol><li>准备一台测试服务器 docker环境</li><li>准备支持jdk的镜像</li></ol><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">FROM openjdk:11</span></span>
<span class="line"><span style="color:#A6ACCD;">COPY . /usr/src/myapp</span></span>
<span class="line"><span style="color:#A6ACCD;">WORKDIR /usr/src/myapp</span></span>
<span class="line"><span style="color:#A6ACCD;">RUN javac Main.java</span></span>
<span class="line"><span style="color:#A6ACCD;">CMD [&quot;java&quot;, &quot;Main&quot;]</span></span></code></pre></div><ol><li>把jar包打包到容器内</li></ol><p>dockerfile</p><div class="language-dockerfile"><button title="Copy Code" class="copy"></button><span class="lang">dockerfile</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#F78C6C;">FROM</span><span style="color:#A6ACCD;"> openjdk:11</span></span>
<span class="line"><span style="color:#F78C6C;">EXPOSE</span><span style="color:#A6ACCD;"> 8080</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F78C6C;">WORKDIR</span><span style="color:#A6ACCD;"> /root</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F78C6C;">ADD</span><span style="color:#A6ACCD;"> jarfile/demo*.jar /root/app.jar</span></span>
<span class="line"><span style="color:#F78C6C;">ENTRYPOINT</span><span style="color:#A6ACCD;"> [</span><span style="color:#C3E88D;">&quot;java&quot;</span><span style="color:#A6ACCD;">,</span><span style="color:#C3E88D;">&quot;-jar&quot;</span><span style="color:#A6ACCD;">,</span><span style="color:#C3E88D;">&quot;/root/app.jar&quot;</span><span style="color:#A6ACCD;">]</span></span></code></pre></div><p>打包镜像</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker build -t demo .</span></span></code></pre></div><p>配置国内镜像</p><p>修改<code>/etc/docker/daemon.json</code>文件，没有的话创建一个</p><p>写入</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    &quot;registry-mirrors&quot;: [</span></span>
<span class="line"><span style="color:#A6ACCD;">        &quot;https://ustc-edu-cn.mirror.aliyuncs.com&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">        &quot;http://hub-mirror.c.163.com&quot;,</span></span>
<span class="line"><span style="color:#A6ACCD;">        &quot;https://registry.aliyuncs.com&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">    ]</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><p>重启服务</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">systemctl daemon-reload</span></span>
<span class="line"><span style="color:#A6ACCD;">systemctl restart docker</span></span></code></pre></div><h2 id="jenkins集群-并发构建" tabindex="-1">Jenkins集群/并发构建 <a class="header-anchor" href="#jenkins集群-并发构建" aria-label="Permalink to &quot;Jenkins集群/并发构建&quot;">​</a></h2><p>集群化构建可以有效提升构建效率，尤其是团队项目比较多或是子项目比较多的时候，可以并发在多台机器上执行构建。</p><h2 id="流水线-pipeline" tabindex="-1">流水线 pipeline <a class="header-anchor" href="#流水线-pipeline" aria-label="Permalink to &quot;流水线 pipeline&quot;">​</a></h2><p>流水线既能作为任务的本身，也能作为Jenkinsfile</p><p>使用流水线可以让我们的任务从ui手动操作，转换为代码化，像docker的dockerfile一样，从shell命令到配置文件，更适合大型项目，可以让团队其他开发者同时参与进来，同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑，作为开发者可读性也更好。</p><h3 id="完整语法" tabindex="-1">完整语法 <a class="header-anchor" href="#完整语法" aria-label="Permalink to &quot;完整语法&quot;">​</a></h3><p>5个必备的组成部分</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">pipeline：整条流水线</span></span>
<span class="line"><span style="color:#A6ACCD;">agent：指定执行器</span></span>
<span class="line"><span style="color:#A6ACCD;">stages：所有阶段</span></span>
<span class="line"><span style="color:#A6ACCD;">stage：某一阶段，可有多个</span></span>
<span class="line"><span style="color:#A6ACCD;">steps：阶段内的每一步，可执行命令</span></span></code></pre></div><h3 id="测试脚本" tabindex="-1">测试脚本 <a class="header-anchor" href="#测试脚本" aria-label="Permalink to &quot;测试脚本&quot;">​</a></h3><h4 id="基础框架" tabindex="-1">基础框架 <a class="header-anchor" href="#基础框架" aria-label="Permalink to &quot;基础框架&quot;">​</a></h4><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">pipeline {</span></span>
<span class="line"><span style="color:#A6ACCD;">    agent any</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    stages {</span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&#39;拉取代码&#39;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;拉取代码完成&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">               </span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&#39;执行构建&#39;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;执行构建完成&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span></span>
<span class="line"><span style="color:#A6ACCD;">    post {</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        always {</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">            echo &quot;完成&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        failure {</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">            echo &quot;失败&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><h4 id="阶段视图-stage-view" tabindex="-1">阶段视图 Stage View <a class="header-anchor" href="#阶段视图-stage-view" aria-label="Permalink to &quot;阶段视图 Stage View&quot;">​</a></h4><h4 id="blue-ocean可视化界面" tabindex="-1">blue ocean可视化界面 <a class="header-anchor" href="#blue-ocean可视化界面" aria-label="Permalink to &quot;blue ocean可视化界面&quot;">​</a></h4><p>全新的流水线控制ui，可重复执行某阶段代码</p><p>插件中心搜索blue ocean安装即可</p><h4 id="post" tabindex="-1">post <a class="header-anchor" href="#post" aria-label="Permalink to &quot;post&quot;">​</a></h4><p>流水线完成后可执行的任务</p><ul><li>always 无论流水线或者阶段的完成状态。</li><li>changed 只有当流水线或者阶段完成状态与之前不同时。</li><li>failure 只有当流水线或者阶段状态为&quot;failure&quot;运行。</li><li>success 只有当流水线或者阶段状态为&quot;success&quot;运行。</li><li>unstable 只有当流水线或者阶段状态为&quot;unstable&quot;运行。例如：测试失败。</li><li>aborted 只有当流水线或者阶段状态为&quot;aborted &quot;运行。例如：手动取消。</li></ul><h4 id="agent" tabindex="-1">agent <a class="header-anchor" href="#agent" aria-label="Permalink to &quot;agent&quot;">​</a></h4><p>可以指定执行节点</p><p>label 指定运行job的节点标签</p><p>any 不指定，由Jenkins分配</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">pipeline {</span></span>
<span class="line"><span style="color:#A6ACCD;">    agent {</span></span>
<span class="line"><span style="color:#A6ACCD;">        node {</span></span>
<span class="line"><span style="color:#A6ACCD;">            label &quot;jenkins-02&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    stages {</span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&#39;拉取代码&#39;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">          </span></span>
<span class="line"><span style="color:#A6ACCD;">                sh &quot;&quot;&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">                    sleep 10</span></span>
<span class="line"><span style="color:#A6ACCD;">                            </span></span>
<span class="line"><span style="color:#A6ACCD;">                   &quot;&quot;&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;拉取代码完成&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">               </span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&#39;执行构建&#39;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;执行构建完成&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span></span>
<span class="line"><span style="color:#A6ACCD;">    post {</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        always {</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">            echo &quot;完成&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        failure {</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">            echo &quot;失败&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><h3 id="pipeline中执行自动化构建" tabindex="-1">pipeline中执行自动化构建 <a class="header-anchor" href="#pipeline中执行自动化构建" aria-label="Permalink to &quot;pipeline中执行自动化构建&quot;">​</a></h3><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">pipeline {</span></span>
<span class="line"><span style="color:#A6ACCD;">    agent any</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    tools {</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        maven &quot;maven3&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">    stages {</span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&quot;拉取代码&quot;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                git branch: &#39;main&#39;, credentialsId: &#39;gitlab&#39;, url: &#39;http://192.168.44.103/root/java-project.git&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;拉取成功&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&quot;执行构建&quot;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">            //    sh &quot;mvn --version&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">                sh &quot;&quot;&quot; </span></span>
<span class="line"><span style="color:#A6ACCD;">                cd demo-1</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                mvn clean package</span></span>
<span class="line"><span style="color:#A6ACCD;">                &quot;&quot;&quot;</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;构建完成&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&quot;clean test server&quot;){</span></span>
<span class="line"><span style="color:#A6ACCD;">            </span></span>
<span class="line"><span style="color:#A6ACCD;">            steps{</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">sshPublisher(publishers: [sshPublisherDesc(configName: &#39;testserver&#39;, transfers: [sshTransfer(cleanRemote: false, excludes: &#39;&#39;, execCommand: &#39;&#39;&#39;rm -rf *</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">docker stop demo</span></span>
<span class="line"><span style="color:#A6ACCD;">docker rm demo</span></span>
<span class="line"><span style="color:#A6ACCD;">docker rmi demo</span></span>
<span class="line"><span style="color:#A6ACCD;">&#39;&#39;&#39;, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: &#39;[, ]+&#39;, remoteDirectory: &#39;&#39;, remoteDirectorySDF: false, removePrefix: &#39;&#39;, sourceFiles: &#39;/root&#39;)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])</span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        </span></span>
<span class="line"><span style="color:#A6ACCD;">        stage(&quot;发送jar包到测试服务器&quot;) {</span></span>
<span class="line"><span style="color:#A6ACCD;">            steps {</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                sshPublisher(publishers: [sshPublisherDesc(configName: &#39;testserver&#39;, transfers: [sshTransfer(cleanRemote: false, excludes: &#39;&#39;, execCommand: &#39;&#39;, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: &#39;[, ]+&#39;, remoteDirectory: &#39;/jarfile&#39;, remoteDirectorySDF: false, removePrefix: &#39;demo-1/target&#39;, sourceFiles: &#39;**/demo*.jar&#39;), sshTransfer(cleanRemote: false, excludes: &#39;&#39;, execCommand: &#39;&#39;&#39;docker build -t demo .</span></span>
<span class="line"><span style="color:#A6ACCD;">docker run -d -p 8080:8080 --name demo demo&#39;&#39;&#39;, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: &#39;[, ]+&#39;, remoteDirectory: &#39;/&#39;, remoteDirectorySDF: false, removePrefix: &#39;demo-1/docker&#39;, sourceFiles: &#39;demo-1/docker/dockerfile&#39;)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                </span></span>
<span class="line"><span style="color:#A6ACCD;">                echo &#39;jar send over!&#39;</span></span>
<span class="line"><span style="color:#A6ACCD;">            }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">        }</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">    }</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><h4 id="声明式流水线" tabindex="-1">声明式流水线 <a class="header-anchor" href="#声明式流水线" aria-label="Permalink to &quot;声明式流水线&quot;">​</a></h4><p>好处</p><ul><li>更像是在Jenkins web ui中的操作</li><li>可读性比较高</li><li>可以使用blue ocean自动生成</li><li>支持语法检查</li></ul><p>坏处</p><ul><li>代码逻辑能力比脚本式弱，不能完成特别复杂的任务</li></ul><h4 id="脚本式流水线" tabindex="-1">脚本式流水线 <a class="header-anchor" href="#脚本式流水线" aria-label="Permalink to &quot;脚本式流水线&quot;">​</a></h4><p>好处</p><ul><li>更少的代码和弱规范要求</li><li>更灵活的自定义代码操作</li><li>不受约束，可以构建特别复杂的工作流和流水线</li></ul><p>坏处</p><ul><li>读写对编程要求比较高</li><li>比声明式流水线代码更复杂</li></ul><h1 id="部署案例" tabindex="-1">部署案例 <a class="header-anchor" href="#部署案例" aria-label="Permalink to &quot;部署案例&quot;">​</a></h1><p><a href="https://mp.weixin.qq.com/s?__biz=MzU4MDUyMDQyNQ==&amp;mid=2247509452&amp;idx=1&amp;sn=a8fb5de200164a3d52dd58f330b4067d&amp;chksm=fd57754aca20fc5c7deb6a7acc47649d4047d8261df98c56472ddebeb9f7be5c8c7cc0862fe5&amp;mpshare=1&amp;scene=23&amp;srcid=0820b5rbDuQkbFNAhCRNr6ue&amp;sharer_sharetime=1660967366964&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">Jenkins+Docker 一键自动化部署 SpringBoot 项目 (qq.com)</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247485031&amp;idx=2&amp;sn=38ee903435b46a9708ab24c9e0bc9b60&amp;chksm=fc2fba6fcb583379d8f31a38887d4a89bcfceb102ed389e1c4b63cbe16cd19f5947fc803dbd9&amp;mpshare=1&amp;scene=23&amp;srcid=0809HsjoSkWtflEqRQMdm48Z&amp;sharer_sharetime=1660038814050&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">我常用的自动化部署技巧，贼好用，推荐给大家！ (qq.com)</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247484270&amp;idx=1&amp;sn=92bc35f7568e061059e58af919e75bde&amp;chksm=fc2fbf66cb5836703713c6da2258704fe3a1adc5f643e0150c545236ec3d6c87385dbc5c2e4a&amp;mpshare=1&amp;scene=23&amp;srcid=08109gU85cbiqXPNtscQay8S&amp;sharer_sharetime=1660105615393&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">使用Jenkins一键打包部署SpringBoot应用，就是这么6！ (qq.com)</a></p><h1 id="灰度发布、蓝绿发布、滚动发布" tabindex="-1">灰度发布、蓝绿发布、滚动发布 <a class="header-anchor" href="#灰度发布、蓝绿发布、滚动发布" aria-label="Permalink to &quot;灰度发布、蓝绿发布、滚动发布&quot;">​</a></h1><p>在项目迭代的过程中，不可避免需要”上线“。上线对应着部署，或者重新部署；部署对应着修改；修改则意味着风险。目前有很多部署发布的技术, 这儿将常见的做一个总结。</p><p>上面所说难免有些抽象, 举一个情景例子, 加入你是微博项目负责人员, 现在新版本较原来的老版本有很大的改变, 这设计到服务架构、前端UI等等, 经过测试功能没有障碍, 那么这时候如何让用户切换到新的版本呢?</p><p>显而易见, 第一次发布的应用是没有所谓的这个问题的, 这种如何发布的思考只会出现在后面的版本迭代中。</p><h2 id="_01、蓝绿发布" tabindex="-1">01、蓝绿发布 <a class="header-anchor" href="#_01、蓝绿发布" aria-label="Permalink to &quot;01、蓝绿发布&quot;">​</a></h2><p>蓝绿部署中，一共有两套系统：一套是正在提供服务系统(也就是上面说的旧版)，标记为“绿色”；另一套是准备发布的系统，标记为“蓝色”。两套系统都是功能完善的，并且正在运行的系统，只是系统版本和对外服务情况不同。正在对外提供服务的老系统是绿色系统，新部署的系统是蓝色系统。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208230958063.png" alt="image-20220823095846980" style="zoom:80%;"><p>蓝色系统不对外提供服务，用来做啥？</p><p>用来做发布前测试，测试过程中发现任何问题，可以直接在蓝色系统上修改，不干扰用户正在使用的系统。</p><p>蓝色系统经过反复的测试、修改、验证，确定达到上线标准之后，直接将用户切换到蓝色系统, 切换后的一段时间内，依旧是蓝绿两套系统并存，但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统（新系统）工作状态，如果出现问题，直接切换回绿色系统。</p><p>当确信对外提供服务的蓝色系统工作正常，不对外提供服务的绿色系统已经不再需要的时候，蓝色系统正式成为对外提供服务系统，成为新的绿色系统。原先的绿色系统可以销毁，将资源释放出来，用于[部署下一个蓝色系统。</p><h3 id="_02、蓝绿发布特点" tabindex="-1">02、蓝绿发布特点 <a class="header-anchor" href="#_02、蓝绿发布特点" aria-label="Permalink to &quot;02、蓝绿发布特点&quot;">​</a></h3><ol><li>蓝绿部署的目的是减少发布时的中断时间、能够快速撤回发布。</li><li>两套系统没有耦合的时候才能百分百保证不干扰</li></ol><h3 id="_03、蓝绿发布注意事项" tabindex="-1">03、蓝绿发布注意事项 <a class="header-anchor" href="#_03、蓝绿发布注意事项" aria-label="Permalink to &quot;03、蓝绿发布注意事项&quot;">​</a></h3><p>蓝绿部署只是[上线策略中的一种，它不是可以应对所有情况的万能方案。蓝绿部署能够简单快捷实施的前提假设是目标系统是非常内聚的，如果目标系统相当复杂，那么如何切换、两套系统的数据是否需要以及如何同步等，都需要仔细考虑。</p><p>当你切换到蓝色环境时，需要妥当处理未完成的业务和新的业务。如果你的数据库后端无法处理，会是一个比较麻烦的问题；</p><ul><li>可能会出现需要同时处理“微服务架构应用”和“传统架构应用”的情况，如果在蓝绿[部署中协调不好这两者，还是有可能会导致服务停止。</li><li>需要提前考虑数据库与应用部署同步迁移 /回滚的问题。</li><li>蓝绿部署需要有基础设施支持。</li><li>在非隔离基础架构（ VM 、 Docker 等）上执行蓝绿[部署，蓝色环境和绿色环境有被摧毁的风险。</li></ul><h2 id="_04、滚动发布" tabindex="-1">04、滚动发布 <a class="header-anchor" href="#_04、滚动发布" aria-label="Permalink to &quot;04、滚动发布&quot;">​</a></h2><p>一般是取出一个或者多个服务器停止服务，执行更新，并重新将其投入使用。周而复始，直到集群中所有的实例都更新成新版本。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208230959741.png" alt="image-20220823095938675" style="zoom:67%;"><p>发布流程:</p><p>相对于蓝绿发布需要一套完备的机器不同, 滚动发布只需要一台机器(这儿这是为了理解, 实际可能是多台), 我们只需要将部分功能部署在这台机器上, 然后去替换正在运行的机器, 如上图, 将更新后的功能部署在Server1 上, 然后Server1去替换正在运行的Server, 替换下来的物理机又可以继续部署Server2的新版本, 然后去替换正在工作的Server2 , 以此类推, 直到替换完所有的服务器, 至此 ,服务更新完成。</p><h3 id="_05、滚动发布特点" tabindex="-1">05、滚动发布特点 <a class="header-anchor" href="#_05、滚动发布特点" aria-label="Permalink to &quot;05、滚动发布特点&quot;">​</a></h3><ol><li>这种部署方式相对于蓝绿部署，更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署，例如每次只取出集群的20%进行升级。</li><li>回滚困难</li></ol><h3 id="_06、滚定发布注意事项" tabindex="-1">06、滚定发布注意事项 <a class="header-anchor" href="#_06、滚定发布注意事项" aria-label="Permalink to &quot;06、滚定发布注意事项&quot;">​</a></h3><ol><li>滚动发布没有一个确定可行的环境。使用蓝绿[部署，我们能够清晰地知道老版本是可行的，而使用滚动发布，我们无法确定。</li><li>修改了现有的环境。</li><li>回滚困难。举个例子，在某一次发布中，我们需要更新100个实例，每次更新10个实例，每次部署需要5分钟。当滚动发布到第80个实例时，发现了问题，需要回滚，这个回滚却是一个痛苦，并且漫长的过程。</li><li>有的时候，我们还可能对系统进行动态伸缩，如果部署期间，系统自动扩容/缩容了，我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具，但是依然令人心惊胆战。</li><li>因为是逐步更新，那么我们在上线代码的时候，就会短暂出现新老版本不一致的情况，如果对上线要求较高的场景，那么就需要考虑如何做好兼容的问题。</li></ol><h2 id="_07、灰度发布" tabindex="-1">07、灰度发布 <a class="header-anchor" href="#_07、灰度发布" aria-label="Permalink to &quot;07、灰度发布&quot;">​</a></h2><p>灰度发布, 也叫金丝雀发布。是指在黑与白之间，能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式，让一部分用户继续用A，一部分用户开始用B，如果用户对B没有什么反对意见，那么逐步扩大范围，把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定，在初始灰度的时候就可以发现、调整问题，以保证其影响度，而我们平常所说的金丝雀[部署也就是灰度发布的一种方式。</p><p>具体到服务器上, 实际操作中还可以做更多控制，譬如说，给最初更新的10台服务器设置较低的权重、控制发送给这10台服务器的请求数，然后逐渐提高权重、增加请求数。一种平滑过渡的思路, 这个控制叫做“流量切分”。</p><blockquote><p>17世纪，英国矿井工人发现，金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯，金丝雀也会停止歌唱；而当瓦斯含量超过一定限度时，虽然鲁钝的人 类毫无察觉，金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下，工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”，以便在危险状况下紧急撤离。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208231000948.png" alt="image-20220823100026882" style="zoom:67%;"><p>过程:</p><ol><li>准备好部署各个阶段的工件，包括：构建工件，测试脚本，配置文件和部署清单文件。</li><li>将“金丝雀”服务器部署进服务器中, 测试。</li><li>从负载均衡列表中移除掉“金丝雀”服务器。</li><li>升级“金丝雀”应用（排掉原有流量并进行[部署）。</li><li>对应用进行自动化测试。</li><li>将“金丝雀”服务器重新添加到负载均衡列表中（连通性和健康检查）。</li><li>如果“金丝雀”在线使用测试成功，升级剩余的其他服务器。（否则就回滚）</li></ol><h2 id="_08、a-b测试" tabindex="-1">08、A/B测试 <a class="header-anchor" href="#_08、a-b测试" aria-label="Permalink to &quot;08、A/B测试&quot;">​</a></h2><p>A/B测试和蓝绿发布、滚动发布以及金丝雀发布，完全是两回事。</p><p>蓝绿发布、滚动发布和金丝雀是发布策略，目标是确保新上线的系统稳定，关注的是新系统的BUG、隐患。</p><p>A/B测试是效果测试，同一时间有多个版本的服务对外服务，这些服务都是经过足够测试，达到了[上线标准的服务，有差异但是没有新旧之分（它们[上线时可能采用了蓝绿部署的方式）。</p><p>A/B测试关注的是不同版本的服务的实际效果，譬如说转化率、订单情况等。</p><p>A/B测试时，线上同时运行多个版本的服务，这些服务通常会有一些体验上的差异，譬如说页面样式、颜色、操作流程不同。相关人员通过分析各个版本服务的实际效果，选出效果最好的版本。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.8.30/202208231000488.png" alt="image-20220823100050435" style="zoom:80%;"><h1 id="jenkins构建springboot" tabindex="-1">Jenkins构建SpringBoot <a class="header-anchor" href="#jenkins构建springboot" aria-label="Permalink to &quot;Jenkins构建SpringBoot&quot;">​</a></h1><p>自动持续集成不知道大家伙有没有听说过，有用过类似的工具吗？</p><p>简而言之，自动持续集成的工作主要是能对项目进行构建、自动化测试和发布。</p><p>今天这篇文章就来讲讲常用的持续集成的工具<code>Jenkins</code>以及如何自动构建<code>Spring Boot</code>项目。</p><h2 id="如何安装jenkins" tabindex="-1">如何安装Jenkins？ <a class="header-anchor" href="#如何安装jenkins" aria-label="Permalink to &quot;如何安装Jenkins？&quot;">​</a></h2><p>Jenkins是Java开发的一套工具，可以直接下载<code>war</code>包部署在<code>Tomcat</code>上，但是今天用最方便、最流行的<code>Docker</code>安装。</p><h3 id="环境准备" tabindex="-1">环境准备 <a class="header-anchor" href="#环境准备" aria-label="Permalink to &quot;环境准备&quot;">​</a></h3><p>在开始安装之前需要准备以下环境和工具：</p><ol><li>一台服务器，当然没有的话可以用自己的电脑，作者的服务器型号是<code>Ubuntu</code>。</li><li><code>JDK</code>环境安装，作者的版本是<code>1.8</code>，至于如何安装，网上很多教程。</li><li>准备<code>maven</code>环境，官网下载一个安装包，放在指定的目录下即可。</li><li><code>Git</code>环境安装，网上教程很多。</li><li>代码托管平台，比如<code>Github</code>、<code>GitLab</code>等。</li></ol><h3 id="开始安装jenkins" tabindex="-1">开始安装Jenkins <a class="header-anchor" href="#开始安装jenkins" aria-label="Permalink to &quot;开始安装Jenkins&quot;">​</a></h3><p><code>Docker</code>安装<code>Jenkins</code>非常方便，只要跟着作者的步骤一步步操作，一定能够安装成功。</p><h4 id="docker环境安装" tabindex="-1">Docker环境安装 <a class="header-anchor" href="#docker环境安装" aria-label="Permalink to &quot;Docker环境安装&quot;">​</a></h4><p>每个型号服务器安装的方式各不相同，读者可以根据自己的型号安装，网上教程很多。</p><h4 id="拉取镜像" tabindex="-1">拉取镜像 <a class="header-anchor" href="#拉取镜像" aria-label="Permalink to &quot;拉取镜像&quot;">​</a></h4><p>我这里安装的版本是<code>jenkins/jenkins:2.222.3-centos</code>，可以去这里获取你需要的版本: <code>https://hub.docker.com/_/jenkins?tab=tags</code>。执行如下命令安装：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">pull</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">jenkins/jenkins:2.222.3-centos</span></span></code></pre></div><h4 id="创建本地数据卷" tabindex="-1">创建本地数据卷 <a class="header-anchor" href="#创建本地数据卷" aria-label="Permalink to &quot;创建本地数据卷&quot;">​</a></h4><p>在本地创建一个数据卷挂载docker容器中的数据卷，我创建的是<code>/data/jenkins_home/</code>，命令如下：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">mkdir</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-p</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/data/jenkins_home/</span></span></code></pre></div><p>需要修改下目录权限，因为当映射本地数据卷时，<code>/data/jenkins_home/</code>目录的拥有者为<code>root</code>用户，而容器中<code>jenkins</code>用户的 <code>uid</code> 为 <code>1000</code>。</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">chown</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-R</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1000</span><span style="color:#C3E88D;">:1000</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/data/jenkins_home/</span></span></code></pre></div><h4 id="创建容器" tabindex="-1">创建容器 <a class="header-anchor" href="#创建容器" aria-label="Permalink to &quot;创建容器&quot;">​</a></h4><p>除了需要挂载上面创建的<code>/data/jenkins_home/</code>以外，还需要挂载<code>maven</code>、<code>jdk</code>的根目录。启动命令如下：</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">docker</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">run</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-d</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">--name</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">jenkins</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-p</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">8040</span><span style="color:#C3E88D;">:8080</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-p</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">50000</span><span style="color:#C3E88D;">:50000</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-v</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/data/jenkins_home:/var/jenkins_home</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-v</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/usr/local/jdk:/usr/local/jdk</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-v</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">/usr/local/maven:/usr/local/maven</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">jenkins/jenkins:2.222.3-centos</span></span></code></pre></div><p>以上命令解析如下：</p><ol><li><code>-d</code>：后台运行容器</li><li><code>--name</code>：指定容器启动的名称</li><li><code>-p</code>：指定映射的端口，这里是将服务器的<code>8040</code>端口映射到容器的<code>8080</code>以及<code>50000</code>映射到容器的<code>50000</code>。<strong>「注意：」</strong> <code>8040</code>和<code>50000</code>一定要是开放的且未被占用，如果用的是云服务器，还需要在管理平台开放对应的规则。</li><li><code>-v</code>：挂载本地的数据卷到<code>docker</code>容器中，<strong>「注意：」</strong> 需要将<code>JDK</code>和<code>maven</code>的所在的目录挂载。</li></ol><h2 id="初始化配置" tabindex="-1">初始化配置 <a class="header-anchor" href="#初始化配置" aria-label="Permalink to &quot;初始化配置&quot;">​</a></h2><p>容器启动成功，则需要配置<code>Jenkins</code>，安装一些插件、配置远程推送等等。</p><h3 id="访问首页" tabindex="-1">访问首页 <a class="header-anchor" href="#访问首页" aria-label="Permalink to &quot;访问首页&quot;">​</a></h3><p>容器创建成功，访问<code>http://ip:8040</code>，如果出现以下页面表示安装成功：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061753165.png" alt="image-20221206175317110" style="zoom:80%;"><h3 id="输入管理员密码" tabindex="-1">输入管理员密码 <a class="header-anchor" href="#输入管理员密码" aria-label="Permalink to &quot;输入管理员密码&quot;">​</a></h3><p>启动成功，则会要求输入密码，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061753546.png" alt="image-20221206175334477" style="zoom:80%;"><p>这里要求输入的是管理的密码，提示是在<code>/var/jenkins_home/secrets/initialAdminPassword</code>，但是我们已经将<code>/var/jenkins_home</code>这个文件夹挂载到本地目录了，因此只需要去挂载的目录<code>/data/jenkins_home/secrets/initialAdminPassword</code>文件中找。</p><p>输入密码，点击继续。</p><h3 id="安装插件" tabindex="-1">安装插件 <a class="header-anchor" href="#安装插件" aria-label="Permalink to &quot;安装插件&quot;">​</a></h3><p>初始化安装只需要安装社区推荐的一些插件即可，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061753686.png" alt="image-20221206175354598" style="zoom:67%;"><p>这里选择<code>安装推荐的插件</code>，然后 <code>Jenkins</code> 会自动开始安装。</p><p><strong>「注意：」</strong> 如果出现想插件安装很慢的问题，找到<code>/data/jenkins_home/updates/default.json</code>文件，替换的内容如下：</p><ol><li>将 <code>updates.jenkins-ci.org/download</code> 替换为<code>mirrors.tuna.tsinghua.edu.cn/jenkins</code></li><li>将 <code>www.google.com</code> 替换为<code>www.baidu.com</code>。</li></ol><p>执行以下两条命令：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">sed -i &#39;s/www.google.com/www.baidu.com/g&#39; default.json</span></span>
<span class="line"><span style="color:#A6ACCD;"></span></span>
<span class="line"><span style="color:#A6ACCD;">sed -i &#39;s/updates.jenkins-ci.org\/download/mirrors.tuna.tsinghua.edu.cn\/jenkins/g&#39; default.json</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061754274.png" alt="image-20221206175410169" style="zoom:67%;"><p>全部安装完成，继续下一步。</p><h3 id="创建管理员" tabindex="-1">创建管理员 <a class="header-anchor" href="#创建管理员" aria-label="Permalink to &quot;创建管理员&quot;">​</a></h3><p>随便创建一个管理员，按要求填写信息，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061754883.png" alt="image-20221206175421822" style="zoom:67%;"><h3 id="实例配置" tabindex="-1">实例配置 <a class="header-anchor" href="#实例配置" aria-label="Permalink to &quot;实例配置&quot;">​</a></h3><p>配置自己的服务器<code>IP</code>和<code>端口</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061754672.png" alt="image-20221206175433615" style="zoom:80%;"><h3 id="配置完成" tabindex="-1">配置完成 <a class="header-anchor" href="#配置完成" aria-label="Permalink to &quot;配置完成&quot;">​</a></h3><p>按照以上步骤，配置完成后自动跳转到如下界面：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061754294.png" alt="image-20221206175449219" style="zoom:67%;"><h2 id="构建spring-boot-项目" tabindex="-1">构建Spring Boot 项目 <a class="header-anchor" href="#构建spring-boot-项目" aria-label="Permalink to &quot;构建Spring Boot 项目&quot;">​</a></h2><p>在构建之前还需要配置一些开发环境，比如<code>JDK</code>，<code>Maven</code>等环境。</p><h3 id="配置jdk、maven、git环境" tabindex="-1">配置JDK、maven、Git环境 <a class="header-anchor" href="#配置jdk、maven、git环境" aria-label="Permalink to &quot;配置JDK、maven、Git环境&quot;">​</a></h3><p><code>Jenkins</code>集成需要用到<code>maven</code>、<code>JDK</code>、<code>Git</code>环境，下面介绍如何配置。</p><p>首先打开<code>系统管理</code>-&gt;<code>全局工具配置</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061756719.png" alt="image-20221206175625653" style="zoom:80%;"><p>分别配置<code>JDK</code>，<code>Git</code>，<code>Maven</code>的路径，根据你的实际路径来填写。</p><p><strong>「注意」</strong>：这里的<code>JDK</code>、<code>Git</code>、<code>Maven</code>环境一定要挂载到<code>docker</code>容器中，否则会出现以下提示：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">xxxx is not a directory on the Jenkins master (but perhaps it exists on some agents)</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061756168.png" alt="image-20221206175643095" style="zoom:80%;"><p>配置成功后，点击保存。</p><h3 id="安装插件-1" tabindex="-1">安装插件 <a class="header-anchor" href="#安装插件-1" aria-label="Permalink to &quot;安装插件&quot;">​</a></h3><p>除了初始化配置中安装的插件外，还需要安装如下几个插件：</p><ol><li><code>Maven Integration</code></li><li><code>Publish Over SSH</code></li></ol><p>打开<code>系统管理</code> -&gt; <code>插件管理</code>，选择<code>可选插件</code>，勾选中 <code>Maven Integration</code> 和 <code>Publish Over SSH</code>，点击<code>直接安装</code>。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061758666.png" alt="image-20221206175808617" style="zoom:80%;"><p>在安装界面勾选上安装完成后重启 <code>Jenkins</code>。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061758614.png" alt="image-20221206175817562" style="zoom:67%;"><h3 id="添加-ssh-server" tabindex="-1">添加 SSH Server <a class="header-anchor" href="#添加-ssh-server" aria-label="Permalink to &quot;添加 SSH Server&quot;">​</a></h3><p><code>SSH Server</code> 是用来连接部署服务器的，用于在项目构建完成后将你的应用推送到服务器中并执行相应的脚本。</p><p>打开 <code>系统管理</code> -&gt; <code>系统配置</code>，找到 <code>Publish Over SSH</code> 部分，选择<code>新增</code></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061758738.png" alt="image-20221206175838683" style="zoom:67%;"><p>点击 <code>高级</code> 展开配置</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061758317.png" alt="image-20221206175852252" style="zoom:80%;"><p>最终配置如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061759338.png" alt="image-20221206175914263" style="zoom:67%;"><p>配置完成后可点击 <code>Test Configuration</code> 测试连接，出现 <code>success</code> 则连接成功。</p><h3 id="添加凭据" tabindex="-1">添加凭据 <a class="header-anchor" href="#添加凭据" aria-label="Permalink to &quot;添加凭据&quot;">​</a></h3><p>凭据 是用来从 <code>Git</code> 仓库拉取代码的，打开 <code>凭据</code> -&gt; <code>系统</code> -&gt; <code>全局凭据</code> -&gt; <code>添加凭据</code></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061759666.png" alt="image-20221206175929612" style="zoom:80%;"><p>这里配置的是<code>Github</code>，直接使用<code>用户名</code>和<code>密码</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061759816.png" alt="image-20221206175948750" style="zoom:67%;"><p>创建成功，点击保存。</p><h3 id="新建maven项目" tabindex="-1">新建Maven项目 <a class="header-anchor" href="#新建maven项目" aria-label="Permalink to &quot;新建Maven项目&quot;">​</a></h3><p>以上配置完成后即可开始构建了，首先需要新建一个<code>Maven</code>项目，步骤如下。</p><h4 id="创建任务" tabindex="-1">创建任务 <a class="header-anchor" href="#创建任务" aria-label="Permalink to &quot;创建任务&quot;">​</a></h4><p>首页点击<code>新建任务</code>-&gt;<code>构建一个maven项目</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061801817.png" alt="image-20221206180123733" style="zoom:80%;"><h4 id="源码管理" tabindex="-1">源码管理 <a class="header-anchor" href="#源码管理" aria-label="Permalink to &quot;源码管理&quot;">​</a></h4><p>在源码管理中，选择<code>Git</code>，填写<code>仓库地址</code>，选择之前添加的<code>凭证</code>。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061801932.png" alt="image-20221206180135852" style="zoom:67%;"><h4 id="构建环境" tabindex="-1">构建环境 <a class="header-anchor" href="#构建环境" aria-label="Permalink to &quot;构建环境&quot;">​</a></h4><p>勾选 <code>Add timestamps to the Console Output</code>，代码构建的过程中会将日志打印出来。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061801376.png" alt="image-20221206180151324" style="zoom:67%;"><h4 id="构建命令" tabindex="-1">构建命令 <a class="header-anchor" href="#构建命令" aria-label="Permalink to &quot;构建命令&quot;">​</a></h4><p>在<code>Build</code>中，填写 <code>Root POM</code> 和 <code>Goals and options</code>，也就是你构建项目的命令。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061802748.png" alt="image-20221206180206697" style="zoom:67%;"><h4 id="post-steps" tabindex="-1">Post Steps <a class="header-anchor" href="#post-steps" aria-label="Permalink to &quot;Post Steps&quot;">​</a></h4><p>选择<code>Run only if build succeeds</code>，添加 <code>Post</code> 步骤，选择 <code>Send files or execute commands over SSH</code>。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061802125.png" alt="image-20221206180219039" style="zoom:67%;"><p>上图各个选项解析如下：</p><ol><li><code>name</code>:选择前面添加的<code>SSH Server</code></li><li><code>Source files</code>:要推送的文件</li><li><code>Remove prefix</code>:文件路径中要去掉的前缀，</li><li><code>Remote directory</code>:要推送到目标服务器上的哪个目录下</li><li><code>Exec command</code>:目标服务器上要执行的脚本</li></ol><p><code>Exec command</code>指定了需要执行的脚本，如下：</p><div class="language-properties"><button title="Copy Code" class="copy"></button><span class="lang">properties</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;"># jdk环境，如果全局配置了，可以省略</span></span>
<span class="line"><span style="color:#A6ACCD;">export </span><span style="color:#F07178;">JAVA_HOME</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">/xx/xx/jdk</span></span>
<span class="line"><span style="color:#A6ACCD;">export </span><span style="color:#F07178;">JRE_HOME</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">/xx/xx/jdk/jre</span></span>
<span class="line"><span style="color:#A6ACCD;">export </span><span style="color:#F07178;">CLASSPATH</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">/xx/xx/jdk/lib</span></span>
<span class="line"><span style="color:#A6ACCD;">export </span><span style="color:#F07178;">PATH</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">$JAVA_HOME/bin:$JRE_HOME/bin:$PATH</span></span>
<span class="line"><span style="color:#A6ACCD;"> </span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># jenkins编译之后的jar包位置，在挂载docker的目录下</span></span>
<span class="line"><span style="color:#F07178;">JAR_PATH</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">/data/jenkins_home/workspace/test/target</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"># 自定义的jar包位置</span></span>
<span class="line"><span style="color:#F07178;">DIR</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">/data/test</span></span>
<span class="line"></span>
<span class="line"><span style="color:#676E95;font-style:italic;">## jar包的名称</span></span>
<span class="line"><span style="color:#F07178;">JARFILE</span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">swagger-demo-0.0.1-SNAPSHOT.jar</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">if [ ! -d $DIR/backup ]</span><span style="color:#676E95;font-style:italic;">;then</span></span>
<span class="line"><span style="color:#A6ACCD;">   mkdir -p $DIR/backup</span></span>
<span class="line"><span style="color:#A6ACCD;">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">ps -ef | grep $JARFILE | grep -v grep | awk </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">{print $2}</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;"> | xargs kill -9</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">if [ -f $DIR/backup/$JARFILE ]</span><span style="color:#676E95;font-style:italic;">; then</span></span>
<span class="line"><span style="color:#A6ACCD;"> rm -f $DIR/backup/$JARFILE</span></span>
<span class="line"><span style="color:#A6ACCD;">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">mv $JAR_PATH/$JARFILE $DIR/backup/$JARFILE</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">java -jar $DIR/backup/$JARFILE &gt; out.log &amp;</span></span>
<span class="line"><span style="color:#A6ACCD;">if [ $? = 0 ]</span><span style="color:#676E95;font-style:italic;">;then</span></span>
<span class="line"><span style="color:#A6ACCD;">        sleep 30</span></span>
<span class="line"><span style="color:#A6ACCD;">        tail -n 50 out.log</span></span>
<span class="line"><span style="color:#A6ACCD;">fi</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">cd $DIR/backup/</span></span>
<span class="line"><span style="color:#A6ACCD;">ls -lt|awk </span><span style="color:#89DDFF;">&#39;</span><span style="color:#C3E88D;">NR&gt;5{print $NF}</span><span style="color:#89DDFF;">&#39;</span><span style="color:#A6ACCD;">|xargs rm -rf</span></span></code></pre></div><p>以上脚本大致的意思就是将<code>kill</code>原有的进程，启动新构建<code>jar</code>包。</p><blockquote><p>脚本可以自己定制，比如备份<code>Jar</code>等操作。</p></blockquote><h2 id="构建任务" tabindex="-1">构建任务 <a class="header-anchor" href="#构建任务" aria-label="Permalink to &quot;构建任务&quot;">​</a></h2><p>项目新建完成之后，一切都已准备就绪，点击<code>立即构建</code>可以开始构建任务，控制台可以看到<code>log</code>输出，如果构建失败，在<code>log</code>中会输出原因。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061810885.png" alt="image-20221206181022806" style="zoom:67%;"><p>任务构建过程会执行脚本启动项目。</p><h2 id="如何构建托管在gitlab的项目" tabindex="-1">如何构建托管在GitLab的项目？ <a class="header-anchor" href="#如何构建托管在gitlab的项目" aria-label="Permalink to &quot;如何构建托管在GitLab的项目？&quot;">​</a></h2><p>上文介绍的例子是构建<code>Github</code>仓库的项目，但是企业中一般都是私服的<code>GitLab</code>，那么又该如何配置呢？</p><p>其实原理是一样的，只是在构建任务的时候选择的是<code>GitLab</code>的凭据，下面将详细介绍。</p><h3 id="安装插件-2" tabindex="-1">安装插件 <a class="header-anchor" href="#安装插件-2" aria-label="Permalink to &quot;安装插件&quot;">​</a></h3><p>在<code>系统管理</code>-&gt;<code>插件管理</code>-&gt;<code>可选插件</code>中搜索<code>GitLab Plugin</code>并安装。</p><h3 id="添加gitlab-api-token" tabindex="-1">添加GitLab API token <a class="header-anchor" href="#添加gitlab-api-token" aria-label="Permalink to &quot;添加GitLab API token&quot;">​</a></h3><p>首先打开 <code>凭据</code> -&gt; <code>系统</code> -&gt; <code>全局凭据</code> -&gt; <code>添加凭据</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061810719.png" alt="image-20221206181042661" style="zoom:80%;"><p>上图中的<code>API token</code>如何获取呢？</p><p>打开<code>GitLab</code>（例如公司内网的<code>GitLab</code>网站），点击个人设置菜单下的<code>setting</code>，再点击<code>Account</code>，复制<code>Private token</code>，如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061810048.png" alt="image-20221206181057989" style="zoom:80%;"><p>上图的<code>Private token</code>则是<code>API token</code>，填上即可。</p><h3 id="配置gitlab插件" tabindex="-1">配置GitLab插件 <a class="header-anchor" href="#配置gitlab插件" aria-label="Permalink to &quot;配置GitLab插件&quot;">​</a></h3><p>打开<code>系统管理</code>-&gt;<code>系统配置</code>-&gt;<code>GitLab</code>，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061811822.png" alt="image-20221206181155746" style="zoom:67%;"><p>配置成功后，点击<code>Test Connection</code>，如果提示<code>Success</code>则配置成功。</p><h3 id="新建任务" tabindex="-1">新建任务 <a class="header-anchor" href="#新建任务" aria-label="Permalink to &quot;新建任务&quot;">​</a></h3><p>新建一个Maven任务，配置的步骤和上文相同，唯一区别则是配置<code>Git</code>仓库地址的地方，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061811297.png" alt="image-20221206181137225" style="zoom:67%;"><p>仓库地址和凭据需要填写<code>Gitlab</code>相对应的。</p><h3 id="后续操作" tabindex="-1">后续操作 <a class="header-anchor" href="#后续操作" aria-label="Permalink to &quot;后续操作&quot;">​</a></h3><p>后续一些操作，比如构建项目，控制台输出等操作，都是和<code>GitHub</code>操作相同，不再赘述了。</p><h2 id="多模块项目如何构建" tabindex="-1">多模块项目如何构建？ <a class="header-anchor" href="#多模块项目如何构建" aria-label="Permalink to &quot;多模块项目如何构建？&quot;">​</a></h2><p>如果你的多模块不是通过私服仓库依赖的，那么在构建打包是有先后顺序的，在新建任务的时候需要配置<code>Build</code>的<code>maven</code>命令，如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212061811378.png" alt="image-20221206181120305" style="zoom:80%;"><p>上图中的<code>Goals and options</code>中的命令就是构建<code>api</code>这个模块的命令，至于这个命令是什么意思，前面有单独一篇文章介绍过，请看<a href="https://mp.weixin.qq.com/s?__biz=MzU3MDAzNDg1MA==&amp;mid=2247485752&amp;idx=1&amp;sn=615f97bd9d161a87f309261c665397b4&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">一次打包引发的思考，原来maven还能这么玩~</a>。</p><h1 id="jenkins-docker" tabindex="-1">Jenkins+Docker <a class="header-anchor" href="#jenkins-docker" aria-label="Permalink to &quot;Jenkins+Docker&quot;">​</a></h1><p>本文章实现最简单全面的Jenkins+docker+springboot 一键自动部署项目，步骤齐全，少走坑路。</p><p><strong>环境</strong>：centos7+git(gitee)</p><p>简述实现步骤：在docker安装jenkins，配置jenkins基本信息，利用Dockerfile和shell脚本实现项目自动拉取打包并运行。</p><blockquote><p>基于 SpringBoot + Vue + uni-app 实现的全套电商系统来了，能支持完整的订单流程！最近mall项目发布了大家期待已久的<code>前台商城系统</code>和<code>视频教程</code>，具体可以参考下文。</p><ul><li><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247507977&amp;idx=1&amp;sn=07b2b95709b46efce1bedeae9b6ffdda&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">mall前台商城系统正式发布，支持完整订单流程！</a></li><li><a href="https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&amp;mid=2247508026&amp;idx=1&amp;sn=b501236f4a24ac8b855ba8f1b5177d56&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">mall视频教程来了，主流Java技术一网打尽！</a></li></ul></blockquote><h2 id="安装docker" tabindex="-1">安装docker <a class="header-anchor" href="#安装docker" aria-label="Permalink to &quot;安装docker&quot;">​</a></h2><p>docker 安装社区版本CE</p><ul><li>确保 yum 包更新到最新。</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum update</span></span></code></pre></div><ul><li>卸载旧版本(如果安装过旧版本的话)</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum remove docker  docker-common docker-selinux docker-engine</span></span></code></pre></div><ul><li>安装需要的软件包</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum install -y yum-utils device-mapper-persistent-data lvm2</span></span></code></pre></div><ul><li>设置yum源</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span></span></code></pre></div><ul><li>安装docker</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">yum install docker-ce  #由于repo中默认只开启stable仓库，故这里安装的是最新稳定版17.12.0</span></span>
<span class="line"><span style="color:#A6ACCD;">yum install &lt;自己的版本&gt;  # 例如：sudo yum install docker-ce-17.12.0.ce</span></span></code></pre></div><ul><li>启动和开机启动</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">systemctl start docker</span></span>
<span class="line"><span style="color:#A6ACCD;">systemctl enable docker</span></span></code></pre></div><ul><li>验证安装是否成功</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker version</span></span></code></pre></div><h2 id="安装jenkins" tabindex="-1">安装Jenkins <a class="header-anchor" href="#安装jenkins" aria-label="Permalink to &quot;安装Jenkins&quot;">​</a></h2><p>Jenkins中文官网：<a href="https://www.jenkins.io/zh/" target="_blank" rel="noreferrer">https://www.jenkins.io/zh/</a></p><ul><li>安装J enkins</li></ul><p>docker 安装一切都是那么简单，注意检查8080是否已经占用！如果占用修改端口</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker run --name jenkins -u root --rm -d -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean</span></span></code></pre></div><p>如果没改端口号的话</p><p>安装完成后访问地址-&gt; <code>http://{部署Jenkins所在服务IP}:8080</code></p><p>此处会有几分钟的等待时间。</p><ul><li>初始化 Jenkins</li></ul><p>详情见官网教程-&gt;<code>https://www.jenkins.io</code></p><ul><li>解锁 Jenkins</li></ul><p>进入Jenkins容器：<code>docker exec -it {Jenkins容器名} bash</code></p><p>例如 <code>docker exec -it jenkins bash</code></p><p>查看密码：<code>cat /var/lib/jenkins/secrets/initialAdminPassword</code></p><p>复制密码到输入框里面</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPrbEhqbcLR8wXrg2KAhUuILPY6o7qC22AdrchC2O5kpkHSy62jv9chA/640?wx_fmt=png&amp;random=0.2761577485869935&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>安装插件</li></ul><p>选择第一个：安装推荐的插件</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPMShC9B9Gb1uaG4wa1HiaEGaoKYKa3IsH63icts1LdKAOwokfbCbkn0hA/640?wx_fmt=png&amp;random=0.24174694738504887&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>创建管理员用户</li></ul><p>此账户一定要记住哦</p><h2 id="系统配置" tabindex="-1">系统配置 <a class="header-anchor" href="#系统配置" aria-label="Permalink to &quot;系统配置&quot;">​</a></h2><ul><li>安装需要插件</li></ul><p>进入【<code>首页</code>】–【<code>系统管理</code>】–【<code>插件管理</code>】–【<code>可选插件</code>】</p><p>搜索以下需要安装的插件，点击安装即可。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPQDKicJDxKMYtmb2MR4zTsibv5nNPOQbXMaK7fF7RuxaeumlDclmjKqbA/640?wx_fmt=png&amp;random=0.0851113119142719&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>安装Maven Integration</li><li>安装Publish Over SSH(如果不需要远程推送，不用安装)</li><li>如果使用Gitee 码云，安装插件Gitee（Git自带不用安装）</li><li>配置Maven</li></ul><p>进入【<code>首页</code>】–【<code>系统管理</code>】–【<code>全局配置</code>】，拉到最下面maven–maven安装</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPia49FfDyicLsL2PFLPF3pLjHRADicwTQXoia7GEA0r5kwCleEFvIgmicmGA/640?wx_fmt=png&amp;random=0.2950981127239827&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="创建任务-1" tabindex="-1">创建任务 <a class="header-anchor" href="#创建任务-1" aria-label="Permalink to &quot;创建任务&quot;">​</a></h2><ul><li>新建任务</li></ul><p>点击【<code>新建任务</code>】，输入任务名称，点击构建一个自由风格的软件项目</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPn4pxtrwxiaVpNPCXVzzxibKnMn4hvt3j7grKIKsvwtu2cgia5f9od5jSQ/640?wx_fmt=png&amp;random=0.5713521000113295&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>源码管理</li></ul><p>点击【<code>源码管理</code>】–【<code>Git</code>】，输入仓库地址，添加凭证，选择好凭证即可。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPOMibyibMl1EhH9Aib2s2lcywNibN4q4kaer2lW755YUFEaUxXpm3saC2CQ/640?wx_fmt=png&amp;random=0.7040381943590521&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPoC0a8j24GtrU1kDfBCoxLbLHzOxCPF8CLOKmvKF1SiannerYcTtMSOA/640?wx_fmt=png&amp;random=0.3578799357090834&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>构建触发器</li></ul><p>点击【<code>构建触发器</code>】–【<code>构建</code>】–【<code>增加构建步骤</code>】–【<code>调用顶层Maven目标</code>】–【<code>填写配置</code>】–【<code>保存</code>】</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPFRPpniaN1AeLVaj1ia4C6a4iaBHHqF9psdXibQQRDWFda8o0qO8aXy998g/640?wx_fmt=png&amp;random=0.15483698622630326&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>此处命令只是install，看是否能生成jar包</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">clean install -Dmaven.test.skip=true</span></span></code></pre></div><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPcuVDibxKIgToKm3kINsEibqtibnDU7dV2hEryTTUiaIMPSqYUjFY0h4tKw/640?wx_fmt=png&amp;random=0.39540935727714044&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>保存</li></ul><p>点击【<code>保存</code>】按钮即可</p><h2 id="测试" tabindex="-1">测试 <a class="header-anchor" href="#测试" aria-label="Permalink to &quot;测试&quot;">​</a></h2><p>该功能测试是否能正常打包</p><ul><li>构建</li></ul><p>点击构建按钮<img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPO0oSgB0Hm2x6P31EGU7UY1USSMhyj3icwibofRLnNoBE2M2ze36Damtw/640?wx_fmt=png&amp;random=0.6333519074716008&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>查看日志</li></ul><p>点击正在构建的任务，或者点击任务名称，进入详情页面，查看控制台输出，看是否能成功打成jar包。</p><p>该处日志第一次可能下载依赖jar包失败，再次点击构建即可成功。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPwWo4BwS4wjnVxb3dE2gXttNz7oHCwaegprnwvibPUmOmjN1ibt7zJxCA/640?wx_fmt=png&amp;random=0.5999876700852618&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPR7ZIgzsXNFukU8lU5v22NCxlsE8s6RkgQ2qiaScpSicKiboUe8gJAjF1A/640?wx_fmt=png&amp;random=0.7780396922427533&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><ul><li>查看项目位置</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">cd /var/jenkins_home/workspace</span></span></code></pre></div><p><code>ll</code>命令即可查看是否存在</p><h2 id="运行项目" tabindex="-1">运行项目 <a class="header-anchor" href="#运行项目" aria-label="Permalink to &quot;运行项目&quot;">​</a></h2><p>因为我们项目和jenkins在同一台服务器，所以我们用shell脚本运行项目，原理既是通过dockerfile 打包镜像，然后docker运行即可。</p><ul><li>Dockerfile</li></ul><p>在springboot项目根目录新建一个名为Dockerfile的文件，注意没有后缀名，其内容如下:（大致就是使用jdk8，把jar包添加到docker然后运行prd配置文件）</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">FROM jdk:8</span></span>
<span class="line"><span style="color:#A6ACCD;">VOLUME /tmp</span></span>
<span class="line"><span style="color:#A6ACCD;">ADD target/zx-order-0.0.1-SNAPSHOT.jar app.jar</span></span>
<span class="line"><span style="color:#A6ACCD;">EXPOSE 8888</span></span>
<span class="line"><span style="color:#A6ACCD;">ENTRYPOINT [&quot;Bash&quot;,&quot;-DBash.security.egd=file:/dev/./urandom&quot;,&quot;-jar&quot;,&quot;/app.jar&quot;,&quot;--spring.profiles.active=prd&quot;]</span></span></code></pre></div><ul><li>修改jenkins任务配置</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPodf2UHianoee3djfCv0SHTyxiaen9CFgOLic89EIXQlDStJqUg20Jd7Lg/640?wx_fmt=png&amp;random=0.8426236552246651&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>配置如下：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACPTIevYoH9CEPPicianP33fnFmMWkxHMVZiaRbVSA7esFlQmXb4Hh4x0s5w/640?wx_fmt=png&amp;random=0.917211172327181&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">-t：指定新镜像名</span></span>
<span class="line"><span style="color:#A6ACCD;">.：表示Dockfile在当前路径</span></span>
<span class="line"><span style="color:#A6ACCD;">cd /var/jenkins_home/workspace/zx-order-api</span></span>
<span class="line"><span style="color:#A6ACCD;">docker stop zx-order || true</span></span>
<span class="line"><span style="color:#A6ACCD;">docker rm zx-order || true</span></span>
<span class="line"><span style="color:#A6ACCD;">docker rmi zx-order || true</span></span>
<span class="line"><span style="color:#A6ACCD;">docker build -t zx-order .</span></span>
<span class="line"><span style="color:#A6ACCD;">docker run -d -p 8888:8888 --name zx-order zx-order:latest</span></span></code></pre></div><p>备注：</p><ul><li>我上图用了docker logs -f 是为了方便看日志，真实不要用，因为会一直等待日志，构建任务会失败</li><li>加|| true 是如果命令执行失败也会继续实行，为了防止第一次没有该镜像报错</li><li>保存</li></ul><p>点击保存即可</p><ul><li>构建</li></ul><p><img src="https://mmbiz.qpic.cn/mmbiz_png/NW4iaKVI4GNNLwxG4hXR3cy7wI4AzdACP1O6qdkh7ibB11ql6qmX8CSibk74qKdzW0AzuPYXORYtiaeot3uRwUMBPQ/640?wx_fmt=png&amp;random=0.7267159854280252&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>查看jenkins控制台输出，输出如下，证明成功！</p><ul><li>验证</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">docker ps 查看是否有自己的容器</span></span>
<span class="line"><span style="color:#A6ACCD;">docker logs 自己的容器名 查看日志是否正确</span></span></code></pre></div><p>浏览器访问项目试一试</p></div></div></main><footer class="VPDocFooter" data-v-6b87e69f data-v-37656e44><!--[--><!--]--><!----><nav class="prev-next" data-v-37656e44><div class="pager" data-v-37656e44><a class="pager-link prev" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-37656e44><span class="desc" data-v-37656e44>Previous page</span><span class="title" data-v-37656e44>ChatGPT</span></a></div><div class="pager" data-v-37656e44><a class="pager-link next" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-37656e44><span class="desc" data-v-37656e44>Next page</span><span class="title" data-v-37656e44>Netty</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"2、数据库_mysql_mysql面试_基础.md\":\"40da680a\",\"1、学前端_5、小程序_小程序项目.md\":\"60a1629b\",\"1、学前端_4、node_知识篇.md\":\"a7fb500e\",\"1、学前端_2、js_ts_es6 进阶.md\":\"6d07ba10\",\"1、学前端_3、vue_vue3_vue3进阶.md\":\"7ac622b4\",\"5、运维_jenkins.md\":\"929081f8\",\"1、学前端_2、js_ts_typescript.md\":\"875a4aa4\",\"2、数据库_mysql_mysql核心_设计.md\":\"7faf46d1\",\"2、数据库_mysql_mysql核心_基础.md\":\"d8e97f3e\",\"1、学前端_1、html_css_html基础.md\":\"7584d076\",\"1、学前端_5、专题篇_问题篇.md\":\"e893aaa2\",\"2、数据库_mysql_mysql面试_进阶.md\":\"f934806d\",\"3、springboot_运维_原理.md\":\"f4a39db6\",\"2、数据库_influxdb.md\":\"6e1711e1\",\"3、springboot_新特性.md\":\"cdf3e307\",\"mybatis_mybatisplus_jpa.md\":\"8e41681b\",\"1、学前端_5、小程序_小程序优化.md\":\"a2185198\",\"2、数据库_redis_redis基础.md\":\"856df0e0\",\"linux_实用脚本.md\":\"f2299dd5\",\"4、微服务_必备_分布式基础.md\":\"d49863d5\",\"2、数据库_redis_redis优化.md\":\"e66ae32f\",\"4、微服务_springsecurity_进阶篇.md\":\"235a8e9e\",\"5、运维_chatgpt.md\":\"10db3823\",\"2、数据库_mysql_分库分表.md\":\"e1c8a095\",\"start.md\":\"9bc1ff8d\",\"5、运维_github.md\":\"2ec6c735\",\"java学前端_css.md\":\"f11b47f0\",\"1、学前端_5、专题篇_知识篇.md\":\"a463ed8d\",\"linux_软件部署.md\":\"d6722925\",\"2、数据库_neo4j.md\":\"97ad22ac\",\"team.md\":\"ce467a6a\",\"nginx_实战篇.md\":\"7785486e\",\"index.md\":\"8c3ec167\",\"计算机基础_计算机网络_网络基础.md\":\"7a54a85d\",\"1、学前端_4、node_进阶篇.md\":\"60f6db69\",\"java_java集合.md\":\"a049b313\",\"1、学前端_3、vue_vue3_vue3高级.md\":\"614d1516\",\"1、学前端_5、小程序_微信小程序.md\":\"9a4be771\",\"5、运维_netty.md\":\"12ca0278\",\"2、数据库_mysql_mysql核心_运维.md\":\"83f97c16\",\"idea_vs code.md\":\"afdcb593\",\"java学前端_vue3_组件.md\":\"1086884e\",\"idea_chrome.md\":\"4a32afbc\",\"云原生_k8s.md\":\"db58e65a\",\"2、数据库_mysql_mysql核心_进阶.md\":\"61d16dff\",\"ssm_springbatch.md\":\"f799ab4a\",\"三高_分布式.md\":\"db1b8a1b\",\"2、数据库_elasticsearch_1、es基础.md\":\"04d17448\",\"linux_linux基础.md\":\"4b0bf394\",\"idea_idea插件.md\":\"fa86e45a\",\"可视化 _ 监控_可视化大屏.md\":\"004553bd\",\"2、数据库_mongodb_整合.md\":\"3c47d7f4\",\"4、微服务_springsecurity_基础篇.md\":\"534a3401\",\"4、微服务_进阶.md\":\"69095c58\",\"计算机基础_计算机基础_操作系统.md\":\"0f75d113\",\"可视化 _ 监控_zabbix.md\":\"71f2270e\",\"nginx_基础篇.md\":\"c7d8bb50\",\"1、学前端_4、node_项目实战.md\":\"bc5065b8\",\"2、数据库_redis_redis原理.md\":\"5cedf685\",\"可视化 _ 监控_监控基础.md\":\"ac56ce4d\",\"三高_高并发.md\":\"ea9ffc99\",\"2、数据库_redis_redis高级.md\":\"1d5872f6\",\"1、学前端_4、node_基础篇.md\":\"581cc13a\",\"2、数据库_mongodb_基础.md\":\"fb7a0a29\",\"idea_idea基础.md\":\"6f2f9638\",\"4、微服务_必备_sentinel.md\":\"2edfbf6c\",\"2、数据库_elasticsearch_3、es高级.md\":\"ef146606\",\"1、学前端_3、vue_vue3_vue3新语法.md\":\"8afd5409\",\"消息中间件_canal.md\":\"3949163c\",\"ssm_maven.md\":\"2c5e12ed\",\"4、微服务_springsecurity_高级篇.md\":\"882d3ff3\",\"linux_linux进阶.md\":\"188ef7b4\",\"计算机基础_设计模式_uml.md\":\"634ba256\",\"计算机基础_算法_leetcode.md\":\"77162fb9\",\"项目实战_小兔鲜_进阶篇1.md\":\"17c52c81\",\"1、学前端_2、js_ts_es6 基础.md\":\"fda3f18b\",\"项目实战_小兔鲜_进阶篇2.md\":\"a0f23006\",\"软件测试_测试基础.md\":\"8c1060cd\",\"2、数据库_redis_本地缓存.md\":\"00617fe6\",\"nginx_面试篇.md\":\"e3fb373a\",\"mybatis_mybatisplus_mybatis.md\":\"9239e0ad\",\"linux_shell.md\":\"ae53d83b\",\"2、数据库_mysql_mysql核心_优化.md\":\"36230425\",\"项目实战_项目推荐.md\":\"f9d97630\",\"mybatis_mybatisplus_mybatisplus.md\":\"0030fd35\",\"项目实战_百度地图_进阶篇.md\":\"c8b93267\",\"三高_高可用.md\":\"323840c5\",\"java_java新特性.md\":\"22abf56d\",\"软件测试_压力测试.md\":\"9ab44440\",\"java学前端_html_js.md\":\"e0fcd240\",\"2、数据库_redis_redis实战.md\":\"d6daeeab\",\"nginx_进阶篇.md\":\"e6b63195\",\"三高_秒杀.md\":\"3878bb64\",\"5、运维_git.md\":\"0264925c\",\"java_java进阶.md\":\"e79cb5b4\",\"并发 _ 多线程_基础篇.md\":\"7adbfac5\",\"项目实战_百度地图_基础篇.md\":\"8afa5954\",\"java学前端_react.md\":\"3ec827dd\",\"1、学前端_1、html_css_css基础.md\":\"01b56712\",\"项目实战_小兔鲜_基础篇.md\":\"646f5df5\",\"1、学前端_2、js_ts_js 基础.md\":\"cb13e36f\",\"可视化 _ 监控_监控进阶.md\":\"0cdbc292\",\"计算机基础_设计模式_基础篇.md\":\"51617287\",\"计算机基础_数据结构_基础篇.md\":\"b2bfd8d4\",\"项目实战_苍穹外卖_进阶篇.md\":\"48415e41\",\"ssm_spring.md\":\"ab514659\",\"消息中间件_rabbitmq.md\":\"45b1eb28\",\"1、学前端_1、html_css_网页进阶.md\":\"db998248\",\"消息中间件_kafka.md\":\"b747dabf\",\"云原生_docker.md\":\"983c7ba7\",\"4、微服务_必备_分布式锁.md\":\"5af1cf8d\",\"消息中间件_rocketmq.md\":\"d441da85\",\"项目实战_黑马头条_基础篇.md\":\"b05af3a6\",\"ssm_springmvc.md\":\"81b9714f\",\"项目实战_支付.md\":\"1d7407dd\",\"项目实战_黑马头条_进阶篇2.md\":\"bff0015b\",\"项目实战_黑马头条_进阶篇.md\":\"19f18388\",\"java学前端_vue2_组件.md\":\"58c6b1df\",\"3、springboot_基础篇.md\":\"529c66f4\",\"3、springboot_应用篇.md\":\"8b92aa61\",\"项目实战_黑马头条_高级篇.md\":\"227c08c1\",\"1、学前端_5、小程序_uniapp.md\":\"71a282b4\",\"项目实战_云尚办公_基础篇.md\":\"1fe188ba\",\"并发 _ 多线程_并发完善.md\":\"26619c46\",\"1、学前端_2、js_ts_js 进阶.md\":\"657dfb8f\",\"java_java高级.md\":\"23782d1a\",\"java_java基础.md\":\"86d67c77\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"VitePress\",\"description\":\"A VitePress site\",\"base\":\"/notebook/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"algolia\":{\"appId\":\"DW7O63I9IR\",\"apiKey\":\"f8ed758cdb288a8b06542bc35923c1a1\",\"indexName\":\"notebook\"},\"sidebar\":[{\"text\":\"Java\",\"collapsed\":true,\"items\":[{\"text\":\"Java基础\",\"link\":\"/Java/Java基础\"},{\"text\":\"Java新特性\",\"link\":\"/Java/Java新特性\"},{\"text\":\"Java进阶\",\"link\":\"/Java/Java进阶\"},{\"text\":\"Java集合\",\"link\":\"/Java/Java集合\"},{\"text\":\"Java高级\",\"link\":\"/Java/Java高级\"}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux基础\",\"link\":\"/Linux/Linux基础\"},{\"text\":\"Linux新特性\",\"link\":\"/Linux/Linux进阶\"},{\"text\":\"Shell脚本\",\"link\":\"/Linux/Shell\"},{\"text\":\"实用脚本\",\"link\":\"/Linux/实用脚本\"},{\"text\":\"软件部署\",\"link\":\"/Linux/软件部署\"}]},{\"text\":\"Nginx\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/Nginx/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/Nginx/进阶篇\"},{\"text\":\"实战篇\",\"link\":\"/Nginx/实战篇\"},{\"text\":\"面试篇\",\"link\":\"/Nginx/面试篇\"}]},{\"text\":\"SSM\",\"collapsed\":true,\"items\":[{\"text\":\"Maven\",\"link\":\"/SSM/Maven\"},{\"text\":\"Spring\",\"link\":\"/SSM/Spring\"},{\"text\":\"SpringMVC\",\"link\":\"/SSM/SpringMVC\"},{\"text\":\"SpringBatch\",\"link\":\"/SSM/SpringBatch\"}]},{\"text\":\"SpringBoot\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/3、SpringBoot/基础篇\"},{\"text\":\"应用篇\",\"link\":\"/3、SpringBoot/应用篇\"},{\"text\":\"新特性\",\"link\":\"/3、SpringBoot/新特性\"},{\"text\":\"运维&原理\",\"link\":\"/3、SpringBoot/运维&原理\"}]},{\"text\":\"SpringCloud\",\"collapsed\":true,\"items\":[{\"text\":\"SpringCloud\",\"link\":\"/4、微服务/进阶\"},{\"text\":\"Sentinel\",\"link\":\"/4、微服务/必备/Sentinel\"}]},{\"text\":\"SpringSecurity\",\"collapsed\":true,\"items\":[{\"text\":\"SpringSecurity基础篇\",\"link\":\"/4、微服务/SpringSecurity/基础篇\"},{\"text\":\"SpringSecurity进阶篇\",\"link\":\"/4、微服务/SpringSecurity/进阶篇\"},{\"text\":\"SpringSecurity高级篇\",\"link\":\"/4、微服务/SpringSecurity/高级篇\"}]},{\"text\":\"Mybatis & MybatisPlus\",\"collapsed\":true,\"items\":[{\"text\":\"Mybatis\",\"link\":\"/Mybatis&MybatisPlus/Mybatis\"},{\"text\":\"MybatisPlus\",\"link\":\"/Mybatis&MybatisPlus/MybatisPlus\"},{\"text\":\"JPA\",\"link\":\"/Mybatis&MybatisPlus/JPA\"}]},{\"text\":\"Git & ChatGPT\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"/5、运维/Git\"},{\"text\":\"Github\",\"link\":\"/5、运维/Github\"},{\"text\":\"ChatGPT\",\"link\":\"/5、运维/ChatGPT\"},{\"text\":\"Jenkins\",\"link\":\"/5、运维/Jenkins\"},{\"text\":\"Netty\",\"link\":\"/5、运维/Netty\"}]},{\"text\":\"数据库\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL基础\",\"link\":\"/2、数据库/MySQL/MySQL核心/基础\"},{\"text\":\"MySQL进阶\",\"link\":\"/2、数据库/MySQL/MySQL核心/进阶\"},{\"text\":\"MySQL优化\",\"link\":\"/2、数据库/MySQL/MySQL核心/优化\"},{\"text\":\"MySQL设计\",\"link\":\"/2、数据库/MySQL/MySQL核心/设计\"},{\"text\":\"MySQL运维\",\"link\":\"/2、数据库/MySQL/MySQL核心/运维\"},{\"text\":\"分库分表\",\"link\":\"/2、数据库/MySQL/分库分表\"}]},{\"text\":\"Redis\",\"collapsed\":true,\"items\":[{\"text\":\"Redis基础\",\"link\":\"/2、数据库/Redis/Redis基础\"},{\"text\":\"Redis优化\",\"link\":\"/2、数据库/Redis/Redis优化\"},{\"text\":\"Redis原理\",\"link\":\"/2、数据库/Redis/Redis原理\"},{\"text\":\"Redis高级\",\"link\":\"/2、数据库/Redis/Redis高级\"},{\"text\":\"Redis实战\",\"link\":\"/2、数据库/Redis/Redis实战\"},{\"text\":\"本地缓存\",\"link\":\"/2、数据库/Redis/本地缓存\"}]},{\"text\":\"MongoDB\",\"collapsed\":true,\"items\":[{\"text\":\"MongoDB基础\",\"link\":\"/2、数据库/MongoDB/基础\"},{\"text\":\"MongoDB进阶\",\"link\":\"/2、数据库/MongoDB/整合\"}]},{\"text\":\"ElasticSearch\",\"collapsed\":true,\"items\":[{\"text\":\"ES基础\",\"link\":\"/2、数据库/ElasticSearch/1、ES基础\"},{\"text\":\"ES高级\",\"link\":\"/2、数据库/ElasticSearch/3、ES高级\"}]},{\"text\":\"InfluxDB\",\"link\":\"/2、数据库/influxdb\"},{\"text\":\"Neo4j\",\"link\":\"/2、数据库/Neo4j\"}]},{\"text\":\"高并发 & 秒杀 & 分布式\",\"collapsed\":true,\"items\":[{\"text\":\"分布式理论\",\"link\":\"/三高/分布式\"},{\"text\":\"分布式锁\",\"link\":\"/4、微服务/必备/分布式锁\"},{\"text\":\"秒杀\",\"link\":\"/三高/秒杀\"},{\"text\":\"高可用\",\"link\":\"/三高/高可用\"},{\"text\":\"高并发\",\"link\":\"/三高/高并发\"}]},{\"text\":\"云原生\",\"collapsed\":true,\"items\":[{\"text\":\"Docker\",\"link\":\"/云原生/Docker\"},{\"text\":\"K8S\",\"link\":\"/云原生/K8S\"}]},{\"text\":\"可视化 & 监控\",\"collapsed\":true,\"items\":[{\"text\":\"监控基础\",\"link\":\"/可视化 & 监控/监控基础\"},{\"text\":\"监控进阶\",\"link\":\"/可视化 & 监控/监控进阶\"},{\"text\":\"可视化大屏\",\"link\":\"/可视化 & 监控/可视化大屏\"},{\"text\":\"Zabbix\",\"link\":\"/可视化 & 监控/Zabbix\"}]},{\"text\":\"学前端\",\"collapsed\":true,\"items\":[{\"text\":\"HTML+CSS\",\"collapsed\":true,\"items\":[{\"text\":\"HTML基础\",\"link\":\"/1、学前端/1、HTML+CSS/HTML基础\"},{\"text\":\"CSS基础\",\"link\":\"/1、学前端/1、HTML+CSS/CSS基础\"},{\"text\":\"网页进阶\",\"link\":\"/1、学前端/1、HTML+CSS/网页进阶\"}]},{\"text\":\"JS+TS\",\"collapsed\":true,\"items\":[{\"text\":\"JS基础\",\"link\":\"/1、学前端/2、JS+TS/JS 基础\"},{\"text\":\"JS进阶\",\"link\":\"/1、学前端/2、JS+TS/JS 进阶\"},{\"text\":\"ES6基础\",\"link\":\"/1、学前端/2、JS+TS/ES6 基础\"},{\"text\":\"ES6进阶\",\"link\":\"/1、学前端/2、JS+TS/ES6 进阶\"},{\"text\":\"TS基础\",\"link\":\"/1、学前端/2、JS+TS/TypeScript\"}]},{\"text\":\"NodeJS\",\"collapsed\":true,\"items\":[{\"text\":\"Node基础\",\"link\":\"/1、学前端/4、Node/基础篇\"},{\"text\":\"Node进阶\",\"link\":\"/1、学前端/4、Node/进阶篇\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/4、Node/项目实战\"}]},{\"text\":\"Vue\",\"collapsed\":true,\"items\":[{\"text\":\"Vue3进阶\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3进阶\"},{\"text\":\"Vue3高级\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3高级\"},{\"text\":\"Vue3新语法\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3新语法\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/3、Vue/Vue2/Vue2项目\"}]},{\"text\":\"小程序\",\"collapsed\":true,\"items\":[{\"text\":\"小程序基础\",\"link\":\"/1、学前端/5、小程序/微信小程序\"},{\"text\":\"小程序优化\",\"link\":\"/1、学前端/5、小程序/小程序优化\"},{\"text\":\"uniapp\",\"link\":\"/1、学前端/5、小程序/uniapp\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/5、小程序/小程序项目\"}]}]},{\"text\":\"计算机基础\",\"collapsed\":true,\"items\":[{\"text\":\"数据结构\",\"link\":\"/计算机基础/数据结构/基础篇\"},{\"text\":\"操作系统\",\"link\":\"/计算机基础/计算机基础/操作系统\"},{\"text\":\"设计模式\",\"link\":\"/计算机基础/设计模式/基础篇\"},{\"text\":\"计算机网络\",\"link\":\"/计算机基础/计算机网络/网络基础\"},{\"text\":\"UML\",\"link\":\"/计算机基础/设计模式/UML\"},{\"text\":\"LeetCode\",\"link\":\"/计算机基础/算法/LeetCode\"}]},{\"text\":\"项目实战\",\"collapsed\":true,\"items\":[{\"text\":\"云尚办公\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/云尚办公/基础篇\"}]},{\"text\":\"小兔鲜\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/小兔鲜/基础篇\"},{\"text\":\"进阶篇1\",\"link\":\"/项目实战/小兔鲜/进阶篇1\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/小兔鲜/进阶篇2\"}]},{\"text\":\"地图\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/百度地图/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/百度地图/进阶篇\"}]},{\"text\":\"苍穹外卖\",\"collapsed\":true,\"items\":[{\"text\":\"进阶篇\",\"link\":\"/项目实战/苍穹外卖/进阶篇\"}]},{\"text\":\"黑马头条\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/黑马头条/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/黑马头条/进阶篇\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/黑马头条/进阶篇2\"},{\"text\":\"高级篇\",\"link\":\"/项目实战/黑马头条/高级篇\"}]},{\"text\":\"支付\",\"link\":\"/项目实战/支付\"},{\"text\":\"项目推荐\",\"link\":\"/项目实战/项目推荐\"}]},{\"text\":\"团队成员\",\"link\":\"/team\"}],\"siteTitle\":\"任硕的文档\",\"logo\":\"/Vue.png\",\"nav\":[{\"text\":\"Java学前端\",\"items\":[{\"items\":[{\"text\":\"HTML+JS\",\"link\":\"/Java学前端/HTML+JS\"},{\"text\":\"CSS\",\"link\":\"/Java学前端/CSS\"},{\"text\":\"Vue2+组件\",\"link\":\"/Java学前端/Vue2+组件\"},{\"text\":\"Vue3+组件\",\"link\":\"/Java学前端/Vue3+组件\"},{\"text\":\"React\",\"link\":\"/Java学前端/React\"}]}],\"activeMatch\":\"/Java/\"},{\"text\":\"软件测试\",\"items\":[{\"items\":[{\"text\":\"测试基础\",\"link\":\"/软件测试/测试基础\"},{\"text\":\"压力测试\",\"link\":\"/软件测试/压力测试\"}]}]},{\"text\":\"多线程\",\"items\":[{\"items\":[{\"text\":\"基础篇\",\"link\":\"/并发 & 多线程/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/并发 & 多线程/并发完善\"}]}]},{\"text\":\"开发工具\",\"items\":[{\"items\":[{\"text\":\"Chrome\",\"link\":\"/IDEA/Chrome\"},{\"text\":\"IDEA基础\",\"link\":\"/IDEA/IDEA基础\"},{\"text\":\"IDEA插件\",\"link\":\"/IDEA/IDEA插件\"},{\"text\":\"VS Code\",\"link\":\"/IDEA/VS Code\"}]}]},{\"text\":\"消息中间件\",\"items\":[{\"items\":[{\"text\":\"RabbitMQ\",\"link\":\"/消息中间件/RabbitMQ\"},{\"text\":\"RocketMQ\",\"link\":\"/消息中间件/RocketMQ\"},{\"text\":\"Kafka\",\"link\":\"/消息中间件/Kafka\"},{\"text\":\"Canal\",\"link\":\"/消息中间件/Canal\"}]}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/renshuo123/renshuo123.github.io\"},{\"icon\":\"twitter\",\"link\":\"#\"},{\"icon\":{\"svg\":\"<svg t=\\\"1676028692954\\\" class=\\\"icon\\\" ...</path></svg>\"},\"link\":\"https://github.com/\"}]},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
    
  </body>
</html>